diff --git a/OSBindings/Mac/Clock SignalTests/PCMPatchedTrackTests.mm b/OSBindings/Mac/Clock SignalTests/PCMPatchedTrackTests.mm index df5514aa6..467c65d7d 100644 --- a/OSBindings/Mac/Clock SignalTests/PCMPatchedTrackTests.mm +++ b/OSBindings/Mac/Clock SignalTests/PCMPatchedTrackTests.mm @@ -56,17 +56,15 @@ - (void)testSingleSplice { std::shared_ptr patchableTrack = self.patchableTogglingTrack; - Storage::Disk::PCMPatchedTrack *patchable = dynamic_cast(patchableTrack.get()); - if(patchable) - { - // add a single one, at 1/32 length at 3/128. So that should shift the location of the second flux transition - Storage::Disk::PCMSegment one_segment; - one_segment.data = {0xff}; - one_segment.number_of_bits = 1; - one_segment.length_of_a_bit.length = 1; - one_segment.length_of_a_bit.clock_rate = 32; - patchable->add_segment(Storage::Time(3, 128), one_segment); - } + Storage::Disk::PCMPatchedTrack *patchable = static_cast(patchableTrack.get()); + + // add a single one, at 1/32 length at 3/128. So that should shift the location of the second flux transition + Storage::Disk::PCMSegment one_segment; + one_segment.data = {0xff}; + one_segment.number_of_bits = 1; + one_segment.length_of_a_bit.length = 1; + one_segment.length_of_a_bit.clock_rate = 32; + patchable->add_segment(Storage::Time(3, 128), one_segment); Storage::Time total_length; std::vector events; @@ -84,4 +82,85 @@ XCTAssert(total_length == Storage::Time(1), @"Total track length should still be 1"); } +- (void)testLeftReplace +{ + std::shared_ptr patchableTrack = self.patchableTogglingTrack; + Storage::Disk::PCMPatchedTrack *patchable = static_cast(patchableTrack.get()); + + Storage::Disk::PCMSegment zero_segment; + zero_segment.data = {0x00}; + zero_segment.number_of_bits = 8; + zero_segment.length_of_a_bit.length = 1; + zero_segment.length_of_a_bit.clock_rate = 16; + patchable->add_segment(Storage::Time(0), zero_segment); + + Storage::Time total_length; + std::vector events; + while(1) + { + events.push_back(patchableTrack->get_next_event()); + total_length += events.back().length; + if(events.back().type == Storage::Disk::Track::Event::IndexHole) break; + } + + XCTAssert(events.size() == 17, @"Should still be 17 total events"); + XCTAssert(events[0].length == Storage::Time(33, 64), @"First event should not occur until 33/64"); + XCTAssert(total_length == Storage::Time(1), @"Total track length should still be 1"); +} + +- (void)testRightReplace +{ + std::shared_ptr patchableTrack = self.patchableTogglingTrack; + Storage::Disk::PCMPatchedTrack *patchable = static_cast(patchableTrack.get()); + + Storage::Disk::PCMSegment zero_segment; + zero_segment.data = {0x00}; + zero_segment.number_of_bits = 8; + zero_segment.length_of_a_bit.length = 1; + zero_segment.length_of_a_bit.clock_rate = 16; + patchable->add_segment(Storage::Time(1, 2), zero_segment); + + Storage::Time total_length; + std::vector events; + while(1) + { + events.push_back(patchableTrack->get_next_event()); + total_length += events.back().length; + if(events.back().type == Storage::Disk::Track::Event::IndexHole) break; + } + + XCTAssert(events.size() == 17, @"Should still be 17 total events"); + XCTAssert(events[16].length == Storage::Time(33, 64), @"Final event should take 33/64"); + XCTAssert(total_length == Storage::Time(1), @"Total track length should still be 1"); +} + +- (void)testMultiReplace +{ + std::shared_ptr patchableTrack = self.patchableTogglingTrack; + Storage::Disk::PCMPatchedTrack *patchable = static_cast(patchableTrack.get()); + + for(int c = 0; c < 4; c++) + { + Storage::Disk::PCMSegment segment; + segment.data = {0xff}; + segment.number_of_bits = 8; + segment.length_of_a_bit.length = 1; + segment.length_of_a_bit.clock_rate = 32; + patchable->add_segment(Storage::Time(c, 4), segment); + } + + Storage::Time total_length; + std::vector events; + while(1) + { + events.push_back(patchableTrack->get_next_event()); + total_length += events.back().length; + if(events.back().type == Storage::Disk::Track::Event::IndexHole) break; + } + + XCTAssert(events.size() == 17, @"Should still be 17 total events"); + XCTAssert(events[16].length == Storage::Time(33, 64), @"Final event should take 33/64"); + XCTAssert(total_length == Storage::Time(1), @"Total track length should still be 1"); +} + @end