1919import static com .google .common .truth .Truth .assertWithMessage ;
2020import static com .team2813 .lib2813 .preferences .PersistedConfiguration .REGISTERED_CLASSES_NETWORK_TABLE_KEY ;
2121import static java .util .stream .Collectors .toMap ;
22- import static org .junit .Assert .assertThrows ;
22+ import static org .junit .jupiter .api .Assertions .assertAll ;
23+ import static org .junit .jupiter .api .Assertions .assertThrows ;
24+ import static org .junit .jupiter .api .Assertions .fail ;
2325
26+ import com .team2813 .lib2813 .testing .junit .jupiter .IsolatedNetworkTablesExtension ;
2427import edu .wpi .first .networktables .NetworkTable ;
2528import edu .wpi .first .networktables .NetworkTableEntry ;
29+ import edu .wpi .first .networktables .NetworkTableInstance ;
2630import edu .wpi .first .networktables .NetworkTableType ;
2731import edu .wpi .first .networktables .Topic ;
2832import edu .wpi .first .wpilibj .DataLogManager ;
2933import edu .wpi .first .wpilibj .Preferences ;
34+ import java .util .ArrayList ;
3035import java .util .HashSet ;
36+ import java .util .List ;
3137import java .util .Map ;
3238import java .util .Set ;
3339import java .util .function .*;
34- import org .junit .After ;
35- import org .junit .Before ;
36- import org .junit .Rule ;
37- import org .junit .Test ;
38- import org .junit .experimental .runners .Enclosed ;
39- import org .junit .rules .ErrorCollector ;
40- import org .junit .runner .RunWith ;
41- import org .junit .runners .Parameterized ;
42- import org .junit .runners .Parameterized .Parameters ;
40+ import org .junit .jupiter .api .AfterEach ;
41+ import org .junit .jupiter .api .BeforeEach ;
42+ import org .junit .jupiter .api .Nested ;
43+ import org .junit .jupiter .api .Test ;
44+ import org .junit .jupiter .api .extension .ExtendWith ;
45+ import org .junit .jupiter .api .function .Executable ;
46+ import org .junit .jupiter .params .ParameterizedClass ;
47+ import org .junit .jupiter .params .provider .ValueSource ;
4348
4449/** Tests for {@link PersistedConfiguration}. */
45- @ RunWith (Enclosed .class )
4650public final class PersistedConfigurationTest {
4751 private static final double EPSILON = 0.001 ;
4852
4953 /** Base class for all nested classes of {@link PersistedConfigurationTest}. */
50- abstract static class PreferencesRegistryTestCase <T extends Record > {
54+ @ Nested
55+ @ ExtendWith (IsolatedNetworkTablesExtension .class )
56+ abstract class PreferencesRegistryTestCase <T extends Record > {
57+ private final List <Executable > collectedErrors = new ArrayList <>();
5158 private final String preferenceName ;
5259 private final Class <T > recordClass ;
53-
54- @ Rule public final IsolatedPreferences isolatedPreferences = new IsolatedPreferences ();
55- @ Rule public final ErrorCollector errorCollector = new ErrorCollector ();
60+ private NetworkTableInstance ntInstance ;
61+ private NetworkTable preferencesTable ;
5662
5763 protected PreferencesRegistryTestCase (String preferenceName , Class <T > recordClass ) {
5864 this .preferenceName = preferenceName ;
5965 this .recordClass = recordClass ;
6066 }
6167
62- @ Before
68+ @ BeforeEach
69+ public final void injectNetworkTableInstance (NetworkTableInstance ntInstance ) {
70+ this .ntInstance = ntInstance ;
71+ preferencesTable = ntInstance .getTable ("Preferences" );
72+ }
73+
74+ @ BeforeEach
6375 public final void setTestGlobals () {
6476 PersistedConfiguration .throwExceptions = true ;
6577 PersistedConfiguration .errorReporter =
66- message ->
67- errorCollector .addError (
68- new AssertionError ("Unexpected warning: \" " + message + "\" " ));
78+ message -> collectedErrors .add (() -> fail ("Unexpected warning: \" " + message + "\" " ));
6979 }
7080
71- @ After
81+ @ AfterEach
7282 public final void resetTestGlobals () {
7383 PersistedConfiguration .throwExceptions = false ;
7484 PersistedConfiguration .errorReporter = DataLogManager ::log ;
85+ assertAll (collectedErrors );
7586 }
7687
7788 protected enum ValuesKind {
@@ -80,7 +91,7 @@ protected enum ValuesKind {
8091 }
8192
8293 private NetworkTableEntry getTableEntry (String key , NetworkTableType expectedType ) {
83- NetworkTableEntry entry = isolatedPreferences . getPreferencesTable () .getEntry (key );
94+ NetworkTableEntry entry = preferencesTable .getEntry (key );
8495 assertThat (entry .getType ()).isEqualTo (expectedType );
8596 return entry ;
8697 }
@@ -102,8 +113,7 @@ protected final String getStringValue(String key) {
102113 }
103114
104115 protected final void setIntegerValue (String key , int value ) {
105- NetworkTable table = isolatedPreferences .getPreferencesTable ();
106- NetworkTableEntry entry = table .getEntry (key );
116+ NetworkTableEntry entry = preferencesTable .getEntry (key );
107117 entry .setInteger (value );
108118 entry .setPersistent ();
109119 }
@@ -116,15 +126,16 @@ protected final void assertHasNoChangesSince(Map<String, Object> previousValues)
116126 }
117127
118128 protected final Map <String , Object > preferenceValues () {
119- NetworkTable table = isolatedPreferences .getPreferencesTable ();
120129 return preferenceKeys ().stream ()
121- .collect (toMap (Function .identity (), key -> table .getEntry (key ).getValue ().getValue ()));
130+ .collect (
131+ toMap (
132+ Function .identity (),
133+ key -> preferencesTable .getEntry (key ).getValue ().getValue ()));
122134 }
123135
124136 protected final Set <String > preferenceKeys () {
125- NetworkTable table = isolatedPreferences .getPreferencesTable ();
126137 Set <String > keys = new HashSet <>();
127- collectKeys (table , keys );
138+ collectKeys (preferencesTable , keys );
128139 return Set .copyOf (keys );
129140 }
130141
@@ -200,11 +211,7 @@ public void preferenceNameMapsToOnlyOneRecordType() {
200211 .containsMatch ("Preference with name '" + preferenceName + "' already registered" );
201212
202213 // Assert: topic added under "/PersistedConfiguration", and is not persistent
203- NetworkTable table =
204- isolatedPreferences
205- .getPreferencesTable ()
206- .getInstance ()
207- .getTable (REGISTERED_CLASSES_NETWORK_TABLE_KEY );
214+ NetworkTable table = ntInstance .getTable (REGISTERED_CLASSES_NETWORK_TABLE_KEY );
208215 NetworkTableEntry entry = table .getEntry (preferenceName );
209216 assertThat (entry .exists ()).isTrue ();
210217 assertThat (entry .isPersistent ()).isFalse ();
@@ -340,20 +347,17 @@ public void withExistingPreferences_passingRecordClass() {
340347 }
341348 }
342349
343- @ RunWith (Parameterized .class )
344- public static class BooleanPreferencesTest
350+ @ Nested
351+ @ ParameterizedClass (name = "defaultValue={0}" )
352+ @ ValueSource (booleans = {true , false })
353+ public class BooleanPreferencesTest
345354 extends PreferencesRegistryTestCase <BooleanPreferencesTest .RecordWithBooleans > {
346355 static final String PREFERENCE_NAME = "Booleans" ;
347356 static final String BOOLEAN_VALUE_KEY = "Booleans/booleanValue" ;
348357 static final String BOOLEAN_SUPPLIER_KEY = "Booleans/booleanSupplier" ;
349358 static final Set <String > ALL_KEYS = Set .of (BOOLEAN_VALUE_KEY , BOOLEAN_SUPPLIER_KEY );
350359 final boolean defaultValue ;
351360
352- @ Parameters (name = "defaultValue={0}" )
353- public static Object [] data () {
354- return new Object [] {true , false };
355- }
356-
357361 public BooleanPreferencesTest (boolean defaultValue ) {
358362 super (PREFERENCE_NAME , RecordWithBooleans .class );
359363 this .defaultValue = defaultValue ;
@@ -429,19 +433,16 @@ protected void assertSuppliersHaveUpdatedValues(RecordWithBooleans record) {
429433 }
430434 }
431435
432- @ RunWith (Parameterized .class )
433- public static class IntPreferencesTest
436+ @ Nested
437+ @ ParameterizedClass (name = "storeAsDoubles={0}" )
438+ @ ValueSource (booleans = {true , false })
439+ public class IntPreferencesTest
434440 extends PreferencesRegistryTestCase <IntPreferencesTest .RecordWithInts > {
435441 static final String PREFERENCE_NAME = "Integers" ;
436442 static final String INT_VALUE_KEY = "Integers/intValue" ;
437443 static final String INT_SUPPLIER_KEY = "Integers/intSupplier" ;
438444 final boolean storeAsDoubles ;
439445
440- @ Parameters (name = "storeAsDoubles={0}" )
441- public static Object [] data () {
442- return new Object [] {true , false };
443- }
444-
445446 public IntPreferencesTest (boolean storeAsDoubles ) {
446447 super (PREFERENCE_NAME , RecordWithInts .class );
447448 this .storeAsDoubles = storeAsDoubles ;
@@ -533,7 +534,8 @@ protected void assertSuppliersHaveUpdatedValues(RecordWithInts record) {
533534 }
534535 }
535536
536- public static class LongPreferencesTest
537+ @ Nested
538+ public class LongPreferencesTest
537539 extends PreferencesRegistryTestCase <LongPreferencesTest .RecordWithLongs > {
538540 static final String PREFERENCE_NAME = "Longs" ;
539541 static final String LONG_VALUE_KEY = "Longs/longValue" ;
@@ -616,7 +618,8 @@ protected void assertSuppliersHaveUpdatedValues(RecordWithLongs record) {
616618 }
617619 }
618620
619- public static class DoublePreferencesTest
621+ @ Nested
622+ public class DoublePreferencesTest
620623 extends PreferencesRegistryTestCase <DoublePreferencesTest .RecordWithDoubles > {
621624 static final String PREFERENCE_NAME = "Doubles" ;
622625 static final String DOUBLE_VALUE_KEY = "Doubles/doubleValue" ;
@@ -699,7 +702,8 @@ protected void assertSuppliersHaveUpdatedValues(RecordWithDoubles record) {
699702 }
700703 }
701704
702- public static class StringPreferencesTest
705+ @ Nested
706+ public class StringPreferencesTest
703707 extends PreferencesRegistryTestCase <StringPreferencesTest .RecordWithStrings > {
704708 static final String PREFERENCE_NAME = "Strings" ;
705709 static final String STRING_VALUE_KEY = "Strings/stringValue" ;
@@ -781,7 +785,8 @@ protected void assertSuppliersHaveUpdatedValues(RecordWithStrings record) {
781785 }
782786 }
783787
784- public static class RecordPreferencesTest
788+ @ Nested
789+ public class RecordPreferencesTest
785790 extends PreferencesRegistryTestCase <RecordPreferencesTest .RecordWithRecords > {
786791 static final String PREFERENCE_NAME = "Records" ;
787792 static final String recordValueKey = "Records/recordValue" ;
0 commit comments