|
1 | | - |
2 | 1 | package com.bencodez.advancedcore.tests; |
3 | 2 |
|
4 | 3 | import static org.junit.jupiter.api.Assertions.assertFalse; |
5 | 4 | import static org.junit.jupiter.api.Assertions.assertTrue; |
6 | 5 | import static org.mockito.ArgumentMatchers.anyInt; |
7 | 6 | import static org.mockito.ArgumentMatchers.anyString; |
| 7 | +import static org.mockito.Mockito.mock; |
| 8 | +import static org.mockito.Mockito.mockStatic; |
| 9 | +import static org.mockito.Mockito.reset; |
8 | 10 | import static org.mockito.Mockito.verify; |
9 | 11 | import static org.mockito.Mockito.when; |
10 | 12 |
|
11 | 13 | import java.time.LocalDateTime; |
12 | 14 | import java.time.temporal.IsoFields; |
13 | 15 |
|
| 16 | +import org.junit.jupiter.api.AfterEach; |
14 | 17 | import org.junit.jupiter.api.BeforeEach; |
15 | 18 | import org.junit.jupiter.api.Test; |
| 19 | +import org.mockito.MockedStatic; |
16 | 20 | import org.mockito.Mockito; |
17 | 21 |
|
| 22 | +import com.bencodez.advancedcore.AdvancedCorePlugin; |
18 | 23 | import com.bencodez.advancedcore.api.time.TimeChecker; |
| 24 | +import com.bencodez.advancedcore.data.ServerData; |
| 25 | +import com.bencodez.advancedcore.AdvancedCoreConfigOptions; |
19 | 26 |
|
20 | 27 | public class TimeCheckerTest { |
21 | 28 |
|
| 29 | + private AdvancedCorePlugin plugin; |
| 30 | + private AdvancedCoreConfigOptions options; |
| 31 | + private ServerData serverDataFile; |
| 32 | + private MockedStatic<AdvancedCorePlugin> pluginStatic; |
22 | 33 | private BaseTest baseTest; |
23 | 34 |
|
24 | 35 | @BeforeEach |
25 | 36 | public void setUp() { |
| 37 | + // 1) create mocks |
| 38 | + plugin = mock(AdvancedCorePlugin.class); |
| 39 | + options = mock(AdvancedCoreConfigOptions.class); |
| 40 | + serverDataFile = mock(ServerData.class); |
| 41 | + |
| 42 | + // 3) stub plugin getters |
| 43 | + when(plugin.getOptions()).thenReturn(options); |
| 44 | + when(plugin.getServerDataFile()).thenReturn(serverDataFile); |
| 45 | + |
| 46 | + // 4) default option values used in tests |
| 47 | + when(options.getTimeZone()).thenReturn("UTC"); |
| 48 | + when(options.getTimeHourOffSet()).thenReturn(2); |
| 49 | + |
26 | 50 | baseTest = BaseTest.getInstance(); |
27 | | - when(baseTest.options.getTimeZone()).thenReturn("UTC"); |
28 | | - when(baseTest.options.getTimeHourOffSet()).thenReturn(2); |
| 51 | + } |
| 52 | + |
| 53 | + @AfterEach |
| 54 | + public void tearDown() { |
| 55 | + |
29 | 56 | } |
30 | 57 |
|
31 | 58 | @Test |
32 | 59 | public void testDayWeekMonthChanges() { |
33 | | - when(baseTest.serverDataFile.getPrevDay()).thenReturn(31); |
34 | | - when(baseTest.serverDataFile.getPrevWeekDay()).thenReturn(52); |
35 | | - when(baseTest.serverDataFile.getPrevMonth()).thenReturn("DECEMBER"); |
| 60 | + // initial “previous” values |
| 61 | + when(serverDataFile.getPrevDay()).thenReturn(31); |
| 62 | + when(serverDataFile.getPrevWeekDay()).thenReturn(52); |
| 63 | + when(serverDataFile.getPrevMonth()).thenReturn("DECEMBER"); |
36 | 64 |
|
37 | | - // Mock the set methods |
38 | | - Mockito.doNothing().when(baseTest.serverDataFile).setPrevDay(anyInt()); |
39 | | - Mockito.doNothing().when(baseTest.serverDataFile).setPrevWeekDay(anyInt()); |
40 | | - Mockito.doNothing().when(baseTest.serverDataFile).setPrevMonth(anyString()); |
| 65 | + // stub the setters as no-ops |
| 66 | + Mockito.doNothing().when(serverDataFile).setPrevDay(anyInt()); |
| 67 | + Mockito.doNothing().when(serverDataFile).setPrevWeekDay(anyInt()); |
| 68 | + Mockito.doNothing().when(serverDataFile).setPrevMonth(anyString()); |
41 | 69 |
|
42 | | - TimeChecker timeChecker = Mockito.spy(new TimeChecker(baseTest.plugin)); |
| 70 | + // spy a fresh TimeChecker |
| 71 | + TimeChecker timeChecker = Mockito.spy(new TimeChecker(plugin)); |
43 | 72 |
|
44 | | - // Simulate each day of the year |
45 | 73 | for (int month = 1; month <= 12; month++) { |
46 | | - int daysInMonth = LocalDateTime.of(2023, month, 1, 0, 0).getMonth().length(false); |
| 74 | + int daysInMonth = LocalDateTime |
| 75 | + .of(2023, month, 1, 0, 0) |
| 76 | + .getMonth() |
| 77 | + .length(false); |
| 78 | + |
47 | 79 | for (int day = 1; day <= daysInMonth; day++) { |
48 | 80 | LocalDateTime mockedTime = LocalDateTime.of(2023, month, day, 12, 0); |
49 | 81 | Mockito.doReturn(mockedTime).when(timeChecker).getTime(); |
50 | 82 |
|
51 | | - boolean dayChanged = timeChecker.hasDayChanged(true); |
52 | | - boolean weekChanged = timeChecker.hasWeekChanged(true); |
| 83 | + boolean dayChanged = timeChecker.hasDayChanged(true); |
| 84 | + boolean weekChanged = timeChecker.hasWeekChanged(true); |
53 | 85 | boolean monthChanged = timeChecker.hasMonthChanged(true); |
54 | 86 |
|
| 87 | + // day should always change |
55 | 88 | assertTrue(dayChanged); |
56 | 89 |
|
| 90 | + // month only changes on the 1st |
57 | 91 | if (day == 1) { |
58 | 92 | assertTrue(monthChanged); |
59 | 93 | } else { |
60 | 94 | assertFalse(monthChanged); |
61 | 95 | } |
62 | 96 |
|
63 | | - verify(baseTest.serverDataFile).setPrevDay(day); |
| 97 | + // verify we recorded the new day |
| 98 | + verify(serverDataFile).setPrevDay(day); |
| 99 | + |
| 100 | + // compute this day's week and check if it rolled over |
64 | 101 | int weekOfYear = mockedTime.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); |
65 | | - if (weekOfYear != mockedTime.minusDays(1).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)) { |
| 102 | + int prevWeekOfYear = mockedTime.minusDays(1) |
| 103 | + .get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); |
| 104 | + |
| 105 | + if (weekOfYear != prevWeekOfYear) { |
66 | 106 | assertTrue(weekChanged); |
67 | | - verify(baseTest.serverDataFile).setPrevWeekDay(weekOfYear); |
| 107 | + verify(serverDataFile).setPrevWeekDay(weekOfYear); |
68 | 108 | } |
| 109 | + |
| 110 | + // verify month setter on the 1st |
69 | 111 | if (day == 1) { |
70 | | - verify(baseTest.serverDataFile).setPrevMonth(mockedTime.getMonth().toString()); |
| 112 | + verify(serverDataFile).setPrevMonth(mockedTime.getMonth().toString()); |
71 | 113 | } |
72 | 114 |
|
73 | | - when(baseTest.serverDataFile.getPrevDay()).thenReturn(day); |
74 | | - when(baseTest.serverDataFile.getPrevWeekDay()).thenReturn(weekOfYear); |
75 | | - when(baseTest.serverDataFile.getPrevMonth()).thenReturn(mockedTime.getMonth().toString()); |
| 115 | + // prepare for next iteration: update “previous” getters |
| 116 | + when(serverDataFile.getPrevDay()).thenReturn(day); |
| 117 | + when(serverDataFile.getPrevWeekDay()).thenReturn(weekOfYear); |
| 118 | + when(serverDataFile.getPrevMonth()).thenReturn(mockedTime.getMonth().toString()); |
76 | 119 |
|
77 | | - // Reset the mock's invocation count |
78 | | - Mockito.reset(baseTest.serverDataFile); |
79 | | - when(baseTest.serverDataFile.getPrevDay()).thenReturn(day); |
80 | | - when(baseTest.serverDataFile.getPrevWeekDay()).thenReturn(weekOfYear); |
81 | | - when(baseTest.serverDataFile.getPrevMonth()).thenReturn(mockedTime.getMonth().toString()); |
| 120 | + // reset invocation counts so verifies start fresh each loop |
| 121 | + reset(serverDataFile); |
| 122 | + when(serverDataFile.getPrevDay()).thenReturn(day); |
| 123 | + when(serverDataFile.getPrevWeekDay()).thenReturn(weekOfYear); |
| 124 | + when(serverDataFile.getPrevMonth()).thenReturn(mockedTime.getMonth().toString()); |
82 | 125 | } |
83 | 126 | } |
84 | 127 | } |
|
0 commit comments