From 22cb8ecd753b0b11de9cfdb5551068416d725ad2 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 19 Nov 2016 08:27:08 +0800 Subject: [PATCH] Started building some tests of the array builder. --- .../Clock Signal.xcodeproj/project.pbxproj | 6 ++ .../Mac/Clock SignalTests/ArrayBuilderTests.h | 13 +++ .../Clock SignalTests/ArrayBuilderTests.mm | 83 +++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.h create mode 100644 OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.mm diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 4e3de67d9..0f69dbae3 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -48,6 +48,7 @@ 4B4DC8281D2C2470003C5BF8 /* C1540.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC8261D2C2470003C5BF8 /* C1540.cpp */; }; 4B4DC82B1D2C27A4003C5BF8 /* SerialBus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC8291D2C27A4003C5BF8 /* SerialBus.cpp */; }; 4B5073071DDD3B9400C48FBD /* ArrayBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B5073051DDD3B9400C48FBD /* ArrayBuilder.cpp */; }; + 4B50730A1DDFCFDF00C48FBD /* ArrayBuilderTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B5073091DDFCFDF00C48FBD /* ArrayBuilderTests.mm */; }; 4B55CE5D1C3B7D6F0093A61B /* CSOpenGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE5C1C3B7D6F0093A61B /* CSOpenGLView.m */; }; 4B55CE5F1C3B7D960093A61B /* MachineDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */; }; 4B59199C1DAC6C46005BB85C /* OricTAP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B59199A1DAC6C46005BB85C /* OricTAP.cpp */; }; @@ -489,6 +490,8 @@ 4B4DC82A1D2C27A4003C5BF8 /* SerialBus.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = SerialBus.hpp; sourceTree = ""; }; 4B5073051DDD3B9400C48FBD /* ArrayBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArrayBuilder.cpp; sourceTree = ""; }; 4B5073061DDD3B9400C48FBD /* ArrayBuilder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ArrayBuilder.hpp; sourceTree = ""; }; + 4B5073081DDFCFDF00C48FBD /* ArrayBuilderTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrayBuilderTests.h; sourceTree = ""; }; + 4B5073091DDFCFDF00C48FBD /* ArrayBuilderTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ArrayBuilderTests.mm; sourceTree = ""; }; 4B55CE5B1C3B7D6F0093A61B /* CSOpenGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSOpenGLView.h; sourceTree = ""; }; 4B55CE5C1C3B7D6F0093A61B /* CSOpenGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSOpenGLView.m; sourceTree = ""; }; 4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MachineDocument.swift; sourceTree = ""; }; @@ -1633,6 +1636,8 @@ 4BB73EB51B587A5100552FC2 /* Clock SignalTests */ = { isa = PBXGroup; children = ( + 4B5073081DDFCFDF00C48FBD /* ArrayBuilderTests.h */, + 4B5073091DDFCFDF00C48FBD /* ArrayBuilderTests.mm */, 4BB73EB81B587A5100552FC2 /* Info.plist */, 4BC9E1ED1D23449A003FCEE4 /* 6502InterruptTests.swift */, 4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */, @@ -2383,6 +2388,7 @@ 4B1E85811D176468001EF87D /* 6532Tests.swift in Sources */, 4BC9E1EE1D23449A003FCEE4 /* 6502InterruptTests.swift in Sources */, 4BEF6AAA1D35CE9E00E73575 /* DigitalPhaseLockedLoopBridge.mm in Sources */, + 4B50730A1DDFCFDF00C48FBD /* ArrayBuilderTests.mm in Sources */, 4B3BA0CE1D318B44005DD7A7 /* C1540Bridge.mm in Sources */, 4B3BA0D11D318B44005DD7A7 /* TestMachine.mm in Sources */, 4B92EACA1B7C112B00246143 /* 6502TimingTests.swift in Sources */, diff --git a/OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.h b/OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.h new file mode 100644 index 000000000..ff1800b4d --- /dev/null +++ b/OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.h @@ -0,0 +1,13 @@ +// +// ArrayBuilderTests.h +// Clock Signal +// +// Created by Thomas Harte on 19/11/2016. +// Copyright © 2016 Thomas Harte. All rights reserved. +// + +#import + +@interface ArrayBuilderTests : XCTestCase + +@end diff --git a/OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.mm b/OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.mm new file mode 100644 index 000000000..983feca4b --- /dev/null +++ b/OSBindings/Mac/Clock SignalTests/ArrayBuilderTests.mm @@ -0,0 +1,83 @@ +// +// ArrayBuilderTests.m +// Clock Signal +// +// Created by Thomas Harte on 19/11/2016. +// Copyright © 2016 Thomas Harte. All rights reserved. +// + +#import "ArrayBuilderTests.h" +#include "ArrayBuilder.hpp" + +static NSData *inputData, *outputData; + +static void setData(bool is_input, uint8_t *data, size_t size) +{ + NSData *dataObject = [NSData dataWithBytes:data length:size]; + if(is_input) inputData = dataObject; else outputData = dataObject; +} + +@implementation ArrayBuilderTests + ++ (void)setUp +{ + inputData = nil; + outputData = nil; +} + +- (void)assertMonotonicForInputSize:(size_t)inputSize outputSize:(size_t)outputSize +{ + XCTAssert(inputData != nil, @"Should have received some input data"); + XCTAssert(outputData != nil, @"Should have received some output data"); + + XCTAssert(inputData.length == inputSize, @"Input data should be 5 bytes long, was %d", inputData.length); + XCTAssert(outputData.length == outputSize, @"Output data should be 3 bytes long, was %d", outputData.length); + + uint8_t *input = (uint8_t *)inputData.bytes; + uint8_t *output = (uint8_t *)outputData.bytes; + + for(int c = 0; c < inputSize; c++) XCTAssert(input[c] == c, @"Input item %d should be %d, was %d", c, c, input[c]); + for(int c = 0; c < outputSize; c++) XCTAssert(output[c] == c + 0x80, @"Output item %d should be %d, was %d", c, c+0x80, output[c]); +} + +- (void)testSingleWriteSingleFlush +{ + Outputs::CRT::ArrayBuilder arrayBuilder(200, 100, setData); + + uint8_t *input = arrayBuilder.get_input_storage(5); + uint8_t *output = arrayBuilder.get_output_storage(3); + + for(int c = 0; c < 5; c++) input[c] = c; + for(int c = 0; c < 3; c++) output[c] = c + 0x80; + + arrayBuilder.flush(); + arrayBuilder.submit(); + + [self assertMonotonicForInputSize:5 outputSize:3]; +} + +- (void)testDoubleWriteSingleFlush +{ + Outputs::CRT::ArrayBuilder arrayBuilder(200, 100, setData); + uint8_t *input; + uint8_t *output; + + input = arrayBuilder.get_input_storage(2); + output = arrayBuilder.get_output_storage(2); + + for(int c = 0; c < 2; c++) input[c] = c; + for(int c = 0; c < 2; c++) output[c] = c + 0x80; + + input = arrayBuilder.get_input_storage(2); + output = arrayBuilder.get_output_storage(2); + + for(int c = 0; c < 2; c++) input[c] = c+2; + for(int c = 0; c < 2; c++) output[c] = c+2 + 0x80; + + arrayBuilder.flush(); + arrayBuilder.submit(); + + [self assertMonotonicForInputSize:4 outputSize:4]; +} + +@end