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