1 // 2 // Copyright (c) 2010-2024 Antmicro 3 // Copyright (c) 2011-2015 Realtime Embedded 4 // 5 // This file is licensed under the MIT License. 6 // Full license text is available in 'licenses/MIT.txt'. 7 // 8 using System; 9 using NUnit.Framework; 10 using Antmicro.Renode.Peripherals; 11 using Antmicro.Renode.Peripherals.Timers; 12 using Antmicro.Renode.Time; 13 14 namespace Antmicro.Renode.UnitTests 15 { 16 [TestFixture] 17 public class ComparingTimerTests 18 { 19 [Test] ShouldThrowOnCompareHigherThanLimit()20 public void ShouldThrowOnCompareHigherThanLimit() 21 { 22 var timer = new ComparingTimer(new BaseClockSource(), 10, null, String.Empty, 20, compare: 5); 23 Assert.Throws<InvalidOperationException>(() => timer.Compare = 30); 24 } 25 26 [Test] ShouldHandleCompareValueChangeWhenEnabled()27 public void ShouldHandleCompareValueChangeWhenEnabled() 28 { 29 var compareCounter = 0; 30 var clockSource = new BaseClockSource(); 31 var timer = new ComparingTimer(clockSource, 1000000, null, String.Empty, 65535 + 1, enabled: true, workMode: WorkMode.Periodic, eventEnabled: true, compare: 65535); 32 timer.CompareReached += delegate { compareCounter++; }; 33 34 clockSource.Advance(TimeInterval.FromMicroseconds(65535), true); 35 Assert.AreEqual(65535, timer.Value); 36 Assert.AreEqual(65535, timer.Compare); 37 Assert.AreEqual(1, compareCounter); 38 39 clockSource.Advance(TimeInterval.FromMicroseconds(1), true); 40 Assert.AreEqual(0, timer.Value); 41 Assert.AreEqual(65535, timer.Compare); 42 Assert.AreEqual(1, compareCounter); 43 44 compareCounter = 0; 45 46 clockSource.Advance(TimeInterval.FromMicroseconds(16304), true); 47 Assert.AreEqual(16304, timer.Value); 48 Assert.AreEqual(65535, timer.Compare); 49 Assert.AreEqual(0, compareCounter); 50 51 timer.Compare = 0; 52 Assert.AreEqual(16304, timer.Value); 53 Assert.AreEqual(0, timer.Compare); 54 Assert.AreEqual(0, compareCounter); 55 56 clockSource.Advance(TimeInterval.FromMicroseconds(65535 - 16304), true); 57 Assert.AreEqual(65535, timer.Value); 58 Assert.AreEqual(0, timer.Compare); 59 Assert.AreEqual(0, compareCounter); 60 61 clockSource.Advance(TimeInterval.FromMicroseconds(1), true); 62 Assert.AreEqual(0, timer.Value); 63 Assert.AreEqual(0, timer.Compare); 64 Assert.AreEqual(1, compareCounter); 65 66 clockSource.Advance(TimeInterval.FromMicroseconds(65535), true); 67 Assert.AreEqual(65535, timer.Value); 68 Assert.AreEqual(0, timer.Compare); 69 Assert.AreEqual(1, compareCounter); 70 71 clockSource.Advance(TimeInterval.FromMicroseconds(1), true); 72 Assert.AreEqual(0, timer.Value); 73 Assert.AreEqual(0, timer.Compare); 74 Assert.AreEqual(2, compareCounter); 75 } 76 77 [Test] ShouldClearWhenValueSetToZero()78 public void ShouldClearWhenValueSetToZero() 79 { 80 var compare = 200UL; 81 var limit = 300UL; 82 var compareCounter = 0; 83 var clockSource = new BaseClockSource(); 84 var timer = new ComparingTimer(clockSource, frequency: 1000000, owner: null, localName: String.Empty, limit: limit, enabled: true, eventEnabled: true, compare: compare); 85 timer.CompareReached += delegate { compareCounter++; }; 86 87 // Run to 100 ticks 88 var advance = 100UL; 89 clockSource.Advance(TimeInterval.FromMicroseconds(advance), true); 90 Assert.AreEqual(advance, timer.Value); 91 Assert.AreEqual(compare, timer.Compare); 92 Assert.AreEqual(compareCounter, 0); 93 94 // Clear timer 95 timer.Value = 0; 96 Assert.AreEqual(timer.Value, 0); 97 Assert.AreEqual(timer.Compare, compare); 98 } 99 100 [Test] ShouldGenerateCompareEventAtCompareAfterClear()101 public void ShouldGenerateCompareEventAtCompareAfterClear() 102 { 103 var limit = 300UL; 104 var compare = 100UL; 105 var compareCounter = 0; 106 var clockSource = new BaseClockSource(); var timer = new ComparingTimer(clockSource, frequency: 1000000, owner: null, 107 localName: String.Empty, limit: limit, enabled: true, eventEnabled: true, compare: compare); 108 timer.CompareReached += delegate { compareCounter++; }; 109 110 // Run to 200 ticks, then clear 111 var advance = 200UL; 112 clockSource.Advance(TimeInterval.FromMicroseconds(advance), true); 113 timer.Value = 0; 114 115 // Now run to compare 116 compareCounter = 0; 117 clockSource.Advance(TimeInterval.FromMicroseconds(compare), true); 118 Assert.AreEqual(compareCounter, 1); 119 Assert.AreEqual(timer.Value, compare); 120 Assert.AreEqual(timer.Compare, compare); 121 } 122 123 [Test] ShouldNotGenerateAdditionalCompareEvent()124 public void ShouldNotGenerateAdditionalCompareEvent() 125 { 126 var limit = 300UL; 127 var compare = 100UL; 128 var compareCounter = 0; 129 var clockSource = new BaseClockSource(); 130 var timer = new ComparingTimer(clockSource, frequency: 1000000, owner: null, 131 localName: String.Empty, limit: limit, enabled: true, eventEnabled: true, compare: compare); 132 timer.CompareReached += delegate { compareCounter++; }; 133 134 Assert.AreEqual(0, compareCounter); 135 136 // Run up to the first compare 137 clockSource.Advance(TimeInterval.FromMicroseconds(100), true); 138 Assert.AreEqual(1, compareCounter); 139 140 // overwrite timer's value with the same value it has; 141 // this should be a nop 142 timer.Value = 100; 143 144 Assert.AreEqual(1, compareCounter); 145 146 // Now run to the next compare event 147 clockSource.Advance(TimeInterval.FromMicroseconds(300), true); 148 Assert.AreEqual(2, compareCounter); 149 Assert.AreEqual(timer.Value, compare); 150 Assert.AreEqual(timer.Compare, compare); 151 } 152 } 153 } 154 155