From 3116a2cf4ccf2b0200d972c0ec9ecf37caa8ccd6 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 17 Dec 2016 21:47:13 -0500 Subject: [PATCH] Realised I was actually testing `PCMSegmentEventSource`, not `PCMSegment`; implemented a spread of tests; hence fixed PCMSegmentEventSource. --- .../Clock Signal.xcodeproj/project.pbxproj | 6 +- .../PCMSegmentEventSourceTests.mm | 80 +++++++++++++++++++ Storage/Disk/PCMSegment.cpp | 7 +- 3 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 OSBindings/Mac/Clock SignalTests/PCMSegmentEventSourceTests.mm diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 7da9dfb84..0294a1e02 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 4B0CCC451C62D0B3001CAC5F /* CRT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0CCC421C62D0B3001CAC5F /* CRT.cpp */; }; 4B121F951E05E66800BFDA12 /* PCMPatchedTrackTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B121F941E05E66800BFDA12 /* PCMPatchedTrackTests.mm */; }; 4B121F981E060CF000BFDA12 /* PCMSegment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B121F961E060CF000BFDA12 /* PCMSegment.cpp */; }; + 4B121F9B1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B121F9A1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm */; }; 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414571B58879D00E04248 /* CPU6502.cpp */; }; 4B14145D1B5887A600E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414571B58879D00E04248 /* CPU6502.cpp */; }; 4B14145E1B5887AA00E04248 /* CPU6502AllRAM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414591B58879D00E04248 /* CPU6502AllRAM.cpp */; }; @@ -430,6 +431,7 @@ 4B121F941E05E66800BFDA12 /* PCMPatchedTrackTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PCMPatchedTrackTests.mm; sourceTree = ""; }; 4B121F961E060CF000BFDA12 /* PCMSegment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PCMSegment.cpp; sourceTree = ""; }; 4B121F971E060CF000BFDA12 /* PCMSegment.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = PCMSegment.hpp; sourceTree = ""; }; + 4B121F9A1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PCMSegmentEventSourceTests.mm; sourceTree = ""; }; 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ClockSignal-Bridging-Header.h"; sourceTree = ""; }; 4B1414571B58879D00E04248 /* CPU6502.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPU6502.cpp; sourceTree = ""; }; 4B1414581B58879D00E04248 /* CPU6502.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CPU6502.hpp; sourceTree = ""; }; @@ -1684,8 +1686,9 @@ 4BB73EB51B587A5100552FC2 /* Clock SignalTests */ = { isa = PBXGroup; children = ( - 4B121F941E05E66800BFDA12 /* PCMPatchedTrackTests.mm */, 4B5073091DDFCFDF00C48FBD /* ArrayBuilderTests.mm */, + 4B121F9A1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm */, + 4B121F941E05E66800BFDA12 /* PCMPatchedTrackTests.mm */, 4BB73EB81B587A5100552FC2 /* Info.plist */, 4BC9E1ED1D23449A003FCEE4 /* 6502InterruptTests.swift */, 4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */, @@ -2452,6 +2455,7 @@ 4B92EACA1B7C112B00246143 /* 6502TimingTests.swift in Sources */, 4BB73EB71B587A5100552FC2 /* AllSuiteATests.swift in Sources */, 4B121F981E060CF000BFDA12 /* PCMSegment.cpp in Sources */, + 4B121F9B1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm in Sources */, 4BEF6AAC1D35D1C400E73575 /* DPLLTests.swift in Sources */, 4B3BA0CF1D318B44005DD7A7 /* MOS6522Bridge.mm in Sources */, 4BC751B21D157E61006C31D9 /* 6522Tests.swift in Sources */, diff --git a/OSBindings/Mac/Clock SignalTests/PCMSegmentEventSourceTests.mm b/OSBindings/Mac/Clock SignalTests/PCMSegmentEventSourceTests.mm new file mode 100644 index 000000000..fde61678a --- /dev/null +++ b/OSBindings/Mac/Clock SignalTests/PCMSegmentEventSourceTests.mm @@ -0,0 +1,80 @@ +// +// PCMSegmentEventSourceTests.m +// Clock Signal +// +// Created by Thomas Harte on 17/12/2016. +// Copyright © 2016 Thomas Harte. All rights reserved. +// + +#import + +#include "PCMSegment.hpp" + +@interface PCMSegmentEventSourceTests : XCTestCase +@end + +@implementation PCMSegmentEventSourceTests + +- (Storage::Disk::PCMSegmentEventSource)segmentSource +{ + Storage::Disk::PCMSegment alternatingFFs; + alternatingFFs.data = {0xff, 0x00, 0xff, 0x00}; + alternatingFFs.length_of_a_bit.length = 1; + alternatingFFs.length_of_a_bit.clock_rate = 10; + alternatingFFs.number_of_bits = 32; + return Storage::Disk::PCMSegmentEventSource(alternatingFFs); +} + +- (void)testCentring +{ + Storage::Disk::PCMSegmentEventSource segmentSource = self.segmentSource; + [self assertFirstTwoEventLengthsForSource:segmentSource]; +} + +- (void)assertFirstTwoEventLengthsForSource:(Storage::Disk::PCMSegmentEventSource &)segmentSource +{ + Storage::Disk::Track::Event first_event = segmentSource.get_next_event(); + Storage::Disk::Track::Event second_event = segmentSource.get_next_event(); + + first_event.length.simplify(); + second_event.length.simplify(); + XCTAssertTrue(first_event.length.length == 1 && first_event.length.clock_rate == 20, @"First event should occur half a bit's length in"); + XCTAssertTrue(second_event.length.length == 1 && second_event.length.clock_rate == 10, @"Second event should occur a whole bit's length after the first"); +} + +- (void)testLongerGap +{ + Storage::Disk::PCMSegmentEventSource segmentSource = self.segmentSource; + + // skip first eight flux transitions + for(int c = 0; c < 8; c++) segmentSource.get_next_event(); + + Storage::Disk::Track::Event next_event = segmentSource.get_next_event(); + next_event.length.simplify(); + + XCTAssertTrue(next_event.length.length == 9 && next_event.length.clock_rate == 10, @"Zero byte should give a nine bit length event gap"); +} + +- (void)testTermination +{ + Storage::Disk::PCMSegmentEventSource segmentSource = self.segmentSource; + Storage::Time total_time; + for(int c = 0; c < 16; c++) total_time += segmentSource.get_next_event().length; + + Storage::Disk::Track::Event final_event = segmentSource.get_next_event(); + total_time += final_event.length; + total_time.simplify(); + + XCTAssertTrue(final_event.type == Storage::Disk::Track::Event::IndexHole, @"Segment should end with an index hole"); + XCTAssertTrue(total_time.length == 16 && total_time.clock_rate == 5, @"Should have taken 32 bit lengths to finish the segment"); +} + +- (void)testReset +{ + Storage::Disk::PCMSegmentEventSource segmentSource = self.segmentSource; + for(int c = 0; c < 8; c++) segmentSource.get_next_event(); + segmentSource.reset(); + [self assertFirstTwoEventLengthsForSource:segmentSource]; +} + +@end diff --git a/Storage/Disk/PCMSegment.cpp b/Storage/Disk/PCMSegment.cpp index 055b369c4..befbda624 100644 --- a/Storage/Disk/PCMSegment.cpp +++ b/Storage/Disk/PCMSegment.cpp @@ -25,13 +25,13 @@ PCMSegmentEventSource::PCMSegmentEventSource(const PCMSegment &segment) : void PCMSegmentEventSource::reset() { bit_pointer_ = 0; - next_event_.length.length = -(segment_.length_of_a_bit.length >> 1); next_event_.type = Track::Event::FluxTransition; } Storage::Disk::Track::Event PCMSegmentEventSource::get_next_event() { - Storage::Disk::Track::Event next_event; + size_t initial_bit_pointer = bit_pointer_; + next_event_.length.length = bit_pointer_ ? 0 : -(segment_.length_of_a_bit.length >> 1); const uint8_t *segment_data = segment_.data.data(); while(bit_pointer_ < segment_.number_of_bits) @@ -43,6 +43,7 @@ Storage::Disk::Track::Event PCMSegmentEventSource::get_next_event() if(bit) return next_event_; } + if(initial_bit_pointer < segment_.number_of_bits) next_event_.length.length += (segment_.length_of_a_bit.length >> 1); next_event_.type = Track::Event::IndexHole; - return next_event; + return next_event_; }