Skip to content

Commit 127e646

Browse files
committed
fix: stopwatch 100% test work
1 parent 4df8266 commit 127e646

File tree

7 files changed

+219
-119
lines changed

7 files changed

+219
-119
lines changed

__tests__/index.spec.ts

+144-49
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,164 @@
1-
import { useTimer, useTime } from '../src/index'
2-
import MockDate from 'mockdate'
1+
import { Validate } from '../src/utils'
2+
import { useTimer, useTime, useStopwatch } from '../src/index'
33

44
beforeEach(() => {
55
jest.useFakeTimers()
6-
MockDate.set(1628693892000)
6+
jest.setSystemTime(1628693892000)
77
})
88

99
afterEach(() => {
1010
jest.useRealTimers()
11-
MockDate.reset()
1211
})
1312

1413
test('init value useTime 24-hour', () => {
15-
const { seconds, minutes, hours, ampm } = useTime()
16-
expect(setInterval).toHaveBeenCalledTimes(1)
17-
expect(setInterval).toHaveBeenLastCalledWith(expect.any(Function), 1000)
18-
expect(seconds).toBe(12)
19-
expect(minutes).toBe(58)
20-
expect(hours).toBe(16)
21-
expect(ampm).toBe('')
14+
const time = useTime()
15+
expect(time.seconds.value).toBe(12)
16+
expect(time.minutes.value).toBe(58)
17+
expect(time.hours.value).toBe(16)
18+
expect(time.ampm.value).toBe('')
2219
})
2320

2421
test('init value useTime 12-hour', () => {
25-
const { seconds, minutes, hours, ampm } = useTime('12-hour')
26-
expect(seconds).toBe(12)
27-
expect(minutes).toBe(58)
28-
expect(hours).toBe(4)
29-
expect(ampm).toBe('pm')
22+
const time = useTime('12-hour')
23+
expect(time.seconds.value).toBe(12)
24+
expect(time.minutes.value).toBe(58)
25+
expect(time.hours.value).toBe(4)
26+
expect(time.ampm.value).toBe('pm')
3027
})
3128

32-
test('run useTime for 3', async () => {
33-
const { seconds, minutes, hours, ampm } = useTime()
34-
expect(seconds).toBe(12)
35-
expect(minutes).toBe(58)
36-
expect(hours).toBe(16)
37-
expect(ampm).toBe('')
38-
jest.advanceTimersByTime(1000)
39-
expect(setInterval).toHaveBeenCalledTimes(1)
40-
MockDate.set(1638693892000)
41-
expect(seconds).toBe(13)
42-
expect(minutes).toBe(58)
43-
expect(hours).toBe(16)
44-
expect(ampm).toBe('')
29+
test('run useTime', async () => {
30+
const time = useTime()
31+
expect(time.seconds.value).toBe(12)
32+
expect(time.minutes.value).toBe(58)
33+
expect(time.hours.value).toBe(16)
34+
expect(time.ampm.value).toBe('')
35+
jest.advanceTimersByTime(3 * 1000)
36+
expect(time.seconds.value).toBe(15)
37+
expect(time.minutes.value).toBe(58)
38+
expect(time.hours.value).toBe(16)
39+
expect(time.ampm.value).toBe('')
40+
jest.advanceTimersByTime(60 * 1000)
41+
expect(time.seconds.value).toBe(15)
42+
expect(time.minutes.value).toBe(59)
43+
expect(time.hours.value).toBe(16)
44+
expect(time.ampm.value).toBe('')
45+
jest.advanceTimersByTime(60 * 60 * 1000)
46+
expect(time.seconds.value).toBe(15)
47+
expect(time.minutes.value).toBe(59)
48+
expect(time.hours.value).toBe(17)
49+
expect(time.ampm.value).toBe('')
50+
})
51+
52+
test('init value useStopwatch', () => {
53+
const stopwatch = useStopwatch(60, false)
54+
expect(stopwatch.isRunning.value).toBe(false)
55+
expect(stopwatch.seconds.value).toBe(0)
56+
expect(stopwatch.minutes.value).toBe(1)
57+
expect(stopwatch.hours.value).toBe(0)
58+
})
59+
60+
test('run useStopwatch', () => {
61+
const stopwatch = useStopwatch(0)
62+
expect(stopwatch.isRunning.value).toBe(true)
63+
jest.advanceTimersByTime(3 * 1000)
64+
expect(stopwatch.seconds.value).toBe(3)
65+
expect(stopwatch.minutes.value).toBe(0)
66+
expect(stopwatch.hours.value).toBe(0)
67+
jest.advanceTimersByTime(60 * 1000)
68+
expect(stopwatch.seconds.value).toBe(3)
69+
expect(stopwatch.minutes.value).toBe(1)
70+
expect(stopwatch.hours.value).toBe(0)
71+
jest.advanceTimersByTime(60 * 60 * 1000)
72+
expect(stopwatch.seconds.value).toBe(3)
73+
expect(stopwatch.minutes.value).toBe(1)
74+
expect(stopwatch.hours.value).toBe(1)
75+
stopwatch.reset(6, false)
76+
expect(stopwatch.isRunning.value).toBe(false)
77+
expect(stopwatch.seconds.value).toBe(6)
78+
expect(stopwatch.minutes.value).toBe(0)
79+
expect(stopwatch.hours.value).toBe(0)
80+
stopwatch.reset(6, true)
81+
expect(stopwatch.isRunning.value).toBe(true)
82+
})
83+
84+
test('start/stop useStopwatch', () => {
85+
const stopwatch = useStopwatch(60, false)
86+
stopwatch.start()
87+
expect(stopwatch.isRunning.value).toBe(true)
88+
jest.advanceTimersByTime(3 * 1000)
89+
expect(stopwatch.seconds.value).toBe(3)
90+
expect(stopwatch.minutes.value).toBe(1)
91+
expect(stopwatch.hours.value).toBe(0)
92+
expect(stopwatch.days.value).toBe(0)
93+
stopwatch.pause()
94+
jest.advanceTimersByTime(3 * 1000)
95+
expect(stopwatch.seconds.value).toBe(3)
96+
expect(stopwatch.minutes.value).toBe(1)
97+
expect(stopwatch.hours.value).toBe(0)
98+
expect(stopwatch.days.value).toBe(0)
4599
})
46100

47101
test('init value useTimer', () => {
48-
const { seconds, minutes, hours, isRunning } = useTimer(60, false)
49-
expect(seconds).toBe(0)
50-
expect(minutes).toBe(0)
51-
expect(hours).toBe(0)
52-
expect(isRunning.value).toBe(false)
102+
const d = new Date().setSeconds(new Date().getSeconds() + 600)
103+
const timer = useTimer(d, false)
104+
expect(timer.seconds.value).toBe(0)
105+
expect(timer.minutes.value).toBe(10)
106+
expect(timer.hours.value).toBe(0)
107+
expect(timer.isRunning.value).toBe(false)
108+
})
109+
110+
test('start/stop/resume useTimer', () => {
111+
const timer = useTimer()
112+
expect(timer.isRunning.value).toBe(true)
113+
timer.start()
114+
expect(timer.isRunning.value).toBe(true)
115+
timer.pause()
116+
expect(timer.isRunning.value).toBe(false)
117+
timer.resume()
118+
expect(timer.isRunning.value).toBe(true)
53119
})
54120

55-
// test('run useTimer for 6', async () => {
56-
// jest.useFakeTimers()
57-
// MockDate.set(1628693892000)
58-
// const { seconds, minutes, hours, isRunning, pause } = useTimer(6)
59-
// expect(isRunning.value).toBe(true)
60-
// jest.advanceTimersByTime(3000)
61-
// expect(setInterval).toHaveBeenCalledTimes(3);
62-
// MockDate.set(1638693892000)
63-
// // jest.runOnlyPendingTimers()
64-
// pause()
65-
// expect(isRunning.value).toBe(false)
66-
// expect(seconds).toBe(3)
67-
// expect(minutes).toBe(0)
68-
// expect(hours).toBe(0)
69-
// });
121+
test('run useTimer for 6', () => {
122+
const d = new Date().setSeconds(new Date().getSeconds() + 600)
123+
const timer = useTimer(d)
124+
expect(timer.isRunning.value).toBe(true)
125+
jest.advanceTimersByTime(3 * 1000)
126+
expect(timer.seconds.value).toBe(57)
127+
expect(timer.minutes.value).toBe(9)
128+
expect(timer.hours.value).toBe(0)
129+
})
130+
131+
test('pause useTimer for 6', () => {
132+
const d = new Date().setSeconds(new Date().getSeconds() + 600)
133+
const timer = useTimer(d)
134+
expect(timer.isRunning.value).toBe(true)
135+
timer.pause()
136+
expect(timer.isRunning.value).toBe(false)
137+
jest.advanceTimersByTime(3 * 1000)
138+
expect(timer.seconds.value).toBe(0)
139+
expect(timer.minutes.value).toBe(10)
140+
expect(timer.hours.value).toBe(0)
141+
})
142+
143+
test('expire useTimer', () => {
144+
const timer = useTimer()
145+
expect(timer.isRunning.value).toBe(true)
146+
expect(timer.isExpired.value).toBe(false)
147+
jest.advanceTimersByTime(60 * 1000)
148+
expect(timer.seconds.value).toBe(0)
149+
expect(timer.minutes.value).toBe(0)
150+
expect(timer.hours.value).toBe(0)
151+
expect(timer.isRunning.value).toBe(false)
152+
expect(timer.isExpired.value).toBe(true)
153+
})
154+
155+
it('calls console.warn if error param', () => {
156+
const consoleSpy = jest.spyOn(console, 'warn')
157+
useTimer(-10)
158+
expect(consoleSpy).toHaveBeenCalledWith(
159+
'vue-timer-hook: { useTimer } Invalid expiryTimestamp settings',
160+
-10
161+
)
162+
const valid = Validate.expiryTimestamp(-10)
163+
expect(valid).toBe(false)
164+
})

src/useStopwatch.ts

+11-12
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,24 @@ export const useStopwatch = (
2020
autoStart: boolean = true
2121
): ResUseStopwatch => {
2222
let interval: Interval
23-
const passedSeconds = ref(
24-
Time.getSecondsFromExpiry(offsetTimestamp, true) || 0
25-
)
23+
const passedSeconds = ref(offsetTimestamp)
24+
2625
const prevTime = ref(epochSeconds())
2726
const seconds = ref(
28-
passedSeconds.value +
29-
Time.getSecondsFromPrevTime(prevTime.value || 0, true).value
27+
passedSeconds.value + Time.getSecondsFromPrevTime(prevTime.value || 0, true)
3028
)
3129
const isRunning = ref(autoStart)
3230

3331
function start() {
34-
const newPrevTime = epochSeconds()
35-
prevTime.value = newPrevTime
32+
prevTime.value = epochSeconds()
3633
isRunning.value = true
3734
seconds.value =
38-
passedSeconds.value + Time.getSecondsFromPrevTime(newPrevTime, true).value
35+
passedSeconds.value + Time.getSecondsFromPrevTime(prevTime.value, true)
3936
interval = useInterval(
4037
() => {
4138
seconds.value =
4239
passedSeconds.value +
43-
Time.getSecondsFromPrevTime(prevTime.value, true).value
40+
Time.getSecondsFromPrevTime(prevTime.value, true)
4441
},
4542
isRunning.value ? 1000 : false
4643
)
@@ -55,11 +52,13 @@ export const useStopwatch = (
5552
function reset(offset = 0, newAutoStart = true) {
5653
pause()
5754
isRunning.value = newAutoStart
58-
passedSeconds.value = Time.getSecondsFromExpiry(offset, true).value || 0
59-
start()
55+
passedSeconds.value = offset
56+
seconds.value = +passedSeconds.value
57+
Time.getSecondsFromPrevTime(prevTime.value, true)
58+
if (isRunning.value) start()
6059
}
6160

62-
start()
61+
if (isRunning.value) start()
6362
return {
6463
...Time.getTimeFromSeconds(seconds),
6564
start,

src/useTime.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
import { Time } from './utils'
22
import { useInterval } from './hooks'
3-
import { Ref } from 'vue'
3+
import { ref, Ref } from 'vue'
44

55
export interface TimeOption {
6-
format: '12-hour' | '24-hour';
6+
format: '12-hour' | '24-hour'
77
}
88
export interface ResUseTime {
9-
seconds: Ref<number>;
10-
minutes: Ref<number>;
11-
hours: Ref<number>;
12-
ampm: Ref<string>;
9+
seconds: Ref<number>
10+
minutes: Ref<number>
11+
hours: Ref<number>
12+
ampm: Ref<string>
1313
}
1414

15-
export const useTime = (format: '12-hour' | '24-hour' = '24-hour'): ResUseTime => {
16-
const seconds = Time.getSecondsFromTimeNow()
15+
export const useTime = (
16+
format: '12-hour' | '24-hour' = '24-hour'
17+
): ResUseTime => {
18+
const seconds = ref(Time.getSecondsFromTimeNow())
1719

1820
useInterval(() => {
19-
seconds.value = Time.getSecondsFromTimeNow().value
21+
seconds.value = Time.getSecondsFromTimeNow()
2022
}, 1000)
2123

2224
return {

src/useTimer.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ function getDelayFromExpiryTimestamp(expiryTimestamp: number) {
1111
}
1212

1313
const seconds = Time.getSecondsFromExpiry(expiryTimestamp)
14-
const extraMilliSeconds = Math.floor(
15-
(seconds.value - Math.floor(seconds.value)) * 1000
16-
)
14+
const extraMilliSeconds = Math.floor((seconds - Math.floor(seconds)) * 1000)
1715
return extraMilliSeconds > 0 ? extraMilliSeconds : DEFAULT_DELAY
1816
}
1917
export interface UseTimer {
@@ -58,7 +56,7 @@ export const useTimer = (expiry = 60, autoStart = true): UseTimer => {
5856
state.didStart = newAutoStart
5957
state.isExpired = false
6058
state.expiryTimestamp = newExpiryTimestamp
61-
state.seconds = Time.getSecondsFromExpiry(newExpiryTimestamp).value
59+
state.seconds = Time.getSecondsFromExpiry(newExpiryTimestamp)
6260
if (state.didStart) start()
6361
}
6462

@@ -72,16 +70,16 @@ export const useTimer = (expiry = 60, autoStart = true): UseTimer => {
7270

7371
function start() {
7472
if (state.didStart) {
75-
state.seconds = Time.getSecondsFromExpiry(state.expiryTimestamp).value
73+
state.seconds = Time.getSecondsFromExpiry(state.expiryTimestamp)
7674
state.isRunning = true
7775
interval = useInterval(
7876
() => {
7977
if (state.delay !== DEFAULT_DELAY) {
8078
state.delay = DEFAULT_DELAY
8179
}
8280
const secondsValue = Time.getSecondsFromExpiry(state.expiryTimestamp)
83-
state.seconds = secondsValue.value
84-
if (secondsValue.value <= 0) {
81+
state.seconds = secondsValue
82+
if (secondsValue <= 0) {
8583
_handleExpire()
8684
}
8785
},

0 commit comments

Comments
 (0)