@@ -49,11 +49,10 @@ public function testWaitUntilNegative() {
4949 public function testRunWithTimer () {
5050 $ epoch = microtime (true );
5151 $ timer = self ::createMock (Timer::class);
52+ $ timer ->method ("isScheduled " )
53+ ->willReturn (true , false );
5254 $ timer ->method ("getNextRunTime " )
53- ->willReturn (
54- $ epoch + 1 ,
55- null
56- );
55+ ->willReturn ($ epoch + 1 , null );
5756
5857 $ sut = new Loop ();
5958 $ sut ->setSleepFunction (function () {});
@@ -66,11 +65,13 @@ public function testRunWithTimer() {
6665 public function testRunWithTimerMultiple () {
6766 $ epoch = microtime (true );
6867 $ timer = self ::createMock (Timer::class);
68+ $ timer ->method ("isScheduled " )
69+ ->willReturn (true , true , true , false );
6970 $ timer ->method ("getNextRunTime " )
7071 ->willReturn (
71- $ epoch + 1 ,
72- $ epoch + 2 ,
73- $ epoch + 3 ,
72+ $ epoch + 100 ,
73+ $ epoch + 200 ,
74+ $ epoch + 300 ,
7475 null
7576 );
7677
@@ -82,107 +83,53 @@ public function testRunWithTimerMultiple() {
8283 self ::assertEquals (3 , $ sut ->getTriggerCount ());
8384 }
8485
85- public function testRunWithTimerNoNextRunTime () {
86- $ timer = self ::createMock (Timer::class);
87- $ timer ->method ("getNextRunTime " )
88- ->willReturn (null );
89-
90- $ sut = new Loop ();
91- $ sut ->addTimer ($ timer );
92- $ sut ->run ();
93-
94- self ::assertEquals (0 , $ sut ->getTriggerCount ());
95- }
96-
97- public function testGetTimerList () {
98- $ epoch = microtime (true );
99-
100- $ timer1 = self ::createMock (Timer::class);
101- $ timer1 ->method ("getNextRunTime " )
102- ->willReturn ($ epoch + 1 , null );
103- $ timer2 = self ::createMock (Timer::class);
104- $ timer2 ->method ("getNextRunTime " )
105- ->willReturn ($ epoch + 2 , null );
106-
107- $ sut = new Loop ();
108- $ sut ->setSleepFunction (function () {});
109- $ sut ->addTimer ($ timer1 );
110- $ sut ->addTimer ($ timer2 );
111-
112- $ timerOrder = $ sut ->getTimerOrder ();
113- self ::assertSame ($ timer1 , $ timerOrder [0 ][1 ]);
114- self ::assertSame ($ timer2 , $ timerOrder [1 ][1 ]);
115- }
116-
117- /**
118- * The only difference here to the test above is that timer1 is set to
119- * be due after timer2, so the order of the timers will be different.
120- */
121- public function testGetTimerListOutOfOrder () {
86+ public function testRunWithTimersConcurrent () {
12287 $ epoch = microtime (true );
88+ $ timerArray = [];
89+ $ numExpectedDueTimers = 0 ;
12390
124- $ timer1 = self ::createMock (Timer::class);
125- $ timer1 ->method ("getNextRunTime " )
126- ->willReturn ($ epoch + 2 , null );
127- $ timer2 = self ::createMock (Timer::class);
128- $ timer2 ->method ("getNextRunTime " )
129- ->willReturn ($ epoch + 1 , null );
130-
131- $ sut = new Loop ();
132- $ sut ->setSleepFunction (function () {});
133- $ sut ->addTimer ($ timer1 );
134- $ sut ->addTimer ($ timer2 );
135-
136- $ timerOrder = $ sut ->getTimerOrder ();
137- self ::assertSame ($ timer2 , $ timerOrder [0 ][1 ]);
138- self ::assertSame ($ timer1 , $ timerOrder [1 ][1 ]);
139- }
140-
141- public function testGetTimerListManyReadyManyFuture () {
142- $ epoch = microtime (true );
91+ for ($ i = 0 ; $ i < 100 ; $ i ++) {
92+ // Randomise the epoch by +/- 100 seconds (roughly half of the timers will be due)
93+ $ rand = rand (-100 , 100 );
94+ $ timerEpoch = $ epoch + $ rand ;
14395
144- $ timerList = [];
96+ $ expectedToBeDue = $ timerEpoch <= $ epoch ;
97+ if ($ expectedToBeDue ) {
98+ $ numExpectedDueTimers ++;
99+ }
145100
146- for ($ i = 0 ; $ i < 100 ; $ i ++) {
147- // Offset the epoch by a random amount between -10 and +10 seconds.
148- $ rand = rand (-1000 , 1000 ) / 100 ;
149101 $ timer = self ::createMock (Timer::class);
102+ $ timer ->method ("isScheduled " )
103+ ->willReturn ($ expectedToBeDue );
150104 $ timer ->method ("getNextRunTime " )
151- ->willReturn ($ epoch + $ rand );
152- $ timerList [] = $ timer ;
105+ ->willReturn ($ timerEpoch );
106+ $ timerArray [] = $ timer ;
153107 }
154108
155109 $ sut = new Loop ();
156- $ sut ->setSleepFunction (function () {});
157-
158- foreach ($ timerList as $ timer ) {
110+ $ sut ->setSleepFunction (function (){});
111+ foreach ($ timerArray as $ timer ) {
159112 $ sut ->addTimer ($ timer );
160113 }
161114
162- $ timerOrder = $ sut ->getTimerOrder ();
163- $ earliest = 0 ;
164- foreach ($ timerOrder as $ timer ) {
165- self ::assertGreaterThanOrEqual ($ earliest , $ timer [0 ]);
166- $ earliest = $ timer [0 ];
167- }
115+ $ sut ->run (false );
116+ self ::assertEquals (
117+ $ numExpectedDueTimers ,
118+ $ sut ->getTriggerCount ()
119+ );
168120 }
169121
170- public function testGetReadyTimers () {
171- $ epoch = microtime (true );
122+ public function testRunWithTimerNoNextRunTime () {
123+ $ timer = self ::createMock (Timer::class);
124+ $ timer ->method ("isScheduled " )
125+ ->willReturn (false );
126+ $ timer ->method ("getNextRunTime " )
127+ ->willReturn (null );
172128
173- $ timerFuture = self ::createMock (Timer::class);
174- $ timerFuture ->method ("getNextRunTime " )
175- ->willReturn ($ epoch + 100 );
176- $ timerPast = self ::createMock (Timer::class);
177- $ timerPast ->method ("getNextRunTime " )
178- ->willReturn ($ epoch - 100 );
179129 $ sut = new Loop ();
180- $ sut ->addTimer ($ timerFuture );
181- $ sut ->addTimer ($ timerPast );
182- $ allTimers = $ sut ->getTimerOrder ();
183- $ readyTimers = $ sut ->getReadyTimers ($ allTimers );
130+ $ sut ->addTimer ($ timer );
131+ $ sut ->run ();
184132
185- self ::assertCount (1 , $ readyTimers );
186- self ::assertSame ($ timerPast , $ readyTimers [0 ][1 ]);
133+ self ::assertEquals (0 , $ sut ->getTriggerCount ());
187134 }
188135}
0 commit comments