33import net .marcellperger .mathexpr .*;
44import net .marcellperger .mathexpr .util .Util ;
55import net .marcellperger .mathexpr .util .UtilCollectors ;
6-
76import org .jetbrains .annotations .Contract ;
87import org .jetbrains .annotations .NotNull ;
98import org .jetbrains .annotations .Nullable ;
10- import org .junit .jupiter .api .Test ;
119import org .junit .jupiter .params .ParameterizedTest ;
1210import org .junit .jupiter .params .provider .ValueSource ;
1311
1412import java .lang .reflect .Field ;
1513import java .util .Arrays ;
1614import java .util .HashMap ;
1715import java .util .Map ;
18- import java .util .Map .Entry ;
1916import java .util .Optional ;
2017
2118import static org .junit .jupiter .api .Assertions .*;
@@ -68,115 +65,91 @@ void assertInfixParsesToInner(String src, int level, MathSymbol expected) {
6865 assertEquals (expected , actual );
6966 }
7067
71- @ Test
72- void parseInfixPrecedenceLevel () {
73- assertInfixParsesTo ("1.0/2.0" , MUL_PREC ,
74- new DivOperation (new BasicDoubleSymbol (1.0 ), new BasicDoubleSymbol (2.0 )));
75- assertInfixParsesTo (".3*6." , MUL_PREC ,
76- new MulOperation (new BasicDoubleSymbol (.3 ), new BasicDoubleSymbol (6. )));
77- assertInfixParsesTo ("2.1*5.3+1.1" , ADD_PREC ,
78- new AddOperation (new MulOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (5.3 )), new BasicDoubleSymbol (1.1 )));
79- assertInfixParsesTo ("0.9-2.1/.3" , ADD_PREC ,
80- new SubOperation (new BasicDoubleSymbol (0.9 ), new DivOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (.3 ))));
81- assertInfixParsesTo ("(2.2+1.1)+3.7" , ADD_PREC ,
82- new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
83- assertInfixParsesTo (CommonData .getBigData1_groupingParens (), ADD_PREC );
84- assertInfixParsesTo (CommonData .getBigData2_groupingParens (), ADD_PREC );
85- assertInfixParsesTo ("2.2+1.1+3.7" , ADD_PREC ,
86- new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
87- assertInfixParsesTo ("2.2+1.1+3.7+0.2" , ADD_PREC ,
88- new AddOperation (new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )), new BasicDoubleSymbol (0.2 )));
89- assertInfixParsesTo (CommonData .getBigData1_minimumParens (), ADD_PREC );
90- assertInfixParsesTo (CommonData .getBigData2_minimumParens (), ADD_PREC );
91- assertInfixParsesTo (".9/2./3.3" , MUL_PREC ,
92- new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
93- assertInfixParsesTo (".9/2./3.3" , ADD_PREC ,
94- new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
95- }
96-
97- @ Test
98- void parseInfixPrecedenceLevel_nocache () {
99- boolean origNocache = nocache ;
100- nocache = true ;
101- try {
102- parseInfixPrecedenceLevel ();
103- } finally {
104- nocache = origNocache ;
68+ @ ParameterizedTest
69+ @ ValueSource (booleans ={true , false })
70+ void parseInfixPrecedenceLevel (boolean disableCache ) {
71+ try (var ignored = new WithNocache (this , disableCache ).start ()) {
72+ assertInfixParsesTo ("1.0/2.0" , MUL_PREC ,
73+ new DivOperation (new BasicDoubleSymbol (1.0 ), new BasicDoubleSymbol (2.0 )));
74+ assertInfixParsesTo (".3*6." , MUL_PREC ,
75+ new MulOperation (new BasicDoubleSymbol (.3 ), new BasicDoubleSymbol (6. )));
76+ assertInfixParsesTo ("2.1*5.3+1.1" , ADD_PREC ,
77+ new AddOperation (new MulOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (5.3 )), new BasicDoubleSymbol (1.1 )));
78+ assertInfixParsesTo ("0.9-2.1/.3" , ADD_PREC ,
79+ new SubOperation (new BasicDoubleSymbol (0.9 ), new DivOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (.3 ))));
80+ assertInfixParsesTo ("(2.2+1.1)+3.7" , ADD_PREC ,
81+ new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
82+ assertInfixParsesTo (CommonData .getBigData1_groupingParens (), ADD_PREC );
83+ assertInfixParsesTo (CommonData .getBigData2_groupingParens (), ADD_PREC );
84+ assertInfixParsesTo ("2.2+1.1+3.7" , ADD_PREC ,
85+ new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
86+ assertInfixParsesTo ("2.2+1.1+3.7+0.2" , ADD_PREC ,
87+ new AddOperation (new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )), new BasicDoubleSymbol (0.2 )));
88+ assertInfixParsesTo (CommonData .getBigData1_minimumParens (), ADD_PREC );
89+ assertInfixParsesTo (CommonData .getBigData2_minimumParens (), ADD_PREC );
90+ assertInfixParsesTo (".9/2./3.3" , MUL_PREC ,
91+ new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
92+ assertInfixParsesTo (".9/2./3.3" , ADD_PREC ,
93+ new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
10594 }
10695 }
10796
108- @ Test
109- void parsePrecedenceLevel () {
110- assertParsesTo ("1.0/2.0" ,
111- new DivOperation (new BasicDoubleSymbol (1.0 ), new BasicDoubleSymbol (2.0 )));
112- assertParsesTo (".3*6." ,
113- new MulOperation (new BasicDoubleSymbol (.3 ), new BasicDoubleSymbol (6. )));
114- assertParsesTo ("2.1*5.3+1.1" ,
115- new AddOperation (new MulOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (5.3 )), new BasicDoubleSymbol (1.1 )));
116- assertParsesTo ("0.9-2.1/.3" ,
117- new SubOperation (new BasicDoubleSymbol (0.9 ), new DivOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (.3 ))));
118- assertParsesTo ("(2.2+1.1)+3.7" ,
119- new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
120- assertParsesTo (CommonData .getBigData1_groupingParens ());
121- assertParsesTo (CommonData .getBigData2_groupingParens ());
122- assertParsesTo ("2.2+1.1+3.7" ,
123- new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
124- assertParsesTo ("2.2+1.1+3.7+0.2" ,
125- new AddOperation (new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )), new BasicDoubleSymbol (0.2 )));
126- assertParsesTo (CommonData .getBigData1_minimumParens ());
127- assertParsesTo (CommonData .getBigData2_minimumParens ());
128- assertParsesTo (".9/2./3.3" ,
129- new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
130- assertParsesTo (".9/2./3.3" ,
131- new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
132- }
133-
134- @ Test // TODO make this not test/inline it
135- void parsePrecedenceLevel_pow () {
136- assertInfixParsesTo ("1.2**9.1" , POW_PREC ,
137- new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )));
138- assertInfixParsesTo ("1.2**9.1**.3" , POW_PREC ,
139- new PowOperation (new BasicDoubleSymbol (1.2 ), new PowOperation (new BasicDoubleSymbol (9.1 ), new BasicDoubleSymbol (.3 ))));
140- assertInfixParsesTo ("1.2**9.1+.3" , ADD_PREC ,
141- new AddOperation (new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )), new BasicDoubleSymbol (.3 )));
142- assertInfixParsesTo (CommonData .getBigData3Pow_minimumParens (), ADD_PREC );
143- assertInfixParsesTo (CommonData .getBigData3Pow_groupingParens (), ADD_PREC );
144- }
145-
146- @ Test
147- void parse_pow () {
148- assertParsesTo ("1.2**9.1" ,
149- new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )));
150- assertParsesTo ("1.2**9.1**.3" ,
151- new PowOperation (new BasicDoubleSymbol (1.2 ), new PowOperation (new BasicDoubleSymbol (9.1 ), new BasicDoubleSymbol (.3 ))));
152- assertParsesTo ("1.2**9.1+.3" ,
153- new AddOperation (new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )), new BasicDoubleSymbol (.3 )));
154- assertParsesTo (CommonData .getBigData3Pow_minimumParens ());
155- assertParsesTo (CommonData .getBigData3Pow_groupingParens ());
156- }
157-
15897 @ ParameterizedTest
15998 @ ValueSource (booleans ={true , false })
160- void parsePrecedenceLevel_pow_nocache (boolean disableCache ) {
161- try (var ignored = new WithNocache (this , disableCache )) {
162- parsePrecedenceLevel_pow ();
99+ void parse (boolean disableCache ) {
100+ try (var ignored = new WithNocache (this , disableCache ).start ()) {
101+ assertParsesTo ("1.0/2.0" ,
102+ new DivOperation (new BasicDoubleSymbol (1.0 ), new BasicDoubleSymbol (2.0 )));
103+ assertParsesTo (".3*6." ,
104+ new MulOperation (new BasicDoubleSymbol (.3 ), new BasicDoubleSymbol (6. )));
105+ assertParsesTo ("2.1*5.3+1.1" ,
106+ new AddOperation (new MulOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (5.3 )), new BasicDoubleSymbol (1.1 )));
107+ assertParsesTo ("0.9-2.1/.3" ,
108+ new SubOperation (new BasicDoubleSymbol (0.9 ), new DivOperation (new BasicDoubleSymbol (2.1 ), new BasicDoubleSymbol (.3 ))));
109+ assertParsesTo ("(2.2+1.1)+3.7" ,
110+ new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
111+ assertParsesTo (CommonData .getBigData1_groupingParens ());
112+ assertParsesTo (CommonData .getBigData2_groupingParens ());
113+ assertParsesTo ("2.2+1.1+3.7" ,
114+ new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )));
115+ assertParsesTo ("2.2+1.1+3.7+0.2" ,
116+ new AddOperation (new AddOperation (new AddOperation (new BasicDoubleSymbol (2.2 ), new BasicDoubleSymbol (1.1 )), new BasicDoubleSymbol (3.7 )), new BasicDoubleSymbol (0.2 )));
117+ assertParsesTo (CommonData .getBigData1_minimumParens ());
118+ assertParsesTo (CommonData .getBigData2_minimumParens ());
119+ assertParsesTo (".9/2./3.3" ,
120+ new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
121+ assertParsesTo (".9/2./3.3" ,
122+ new DivOperation (new DivOperation (new BasicDoubleSymbol (.9 ), new BasicDoubleSymbol (2. )), new BasicDoubleSymbol (3.3 )));
163123 }
164124 }
165125
166- // TODO do more parameterized tests
167126 @ ParameterizedTest
168127 @ ValueSource (booleans ={true , false })
169- void parse_pow_nocache (boolean disableCache ) {
128+ void parsePrecedenceLevel_pow (boolean disableCache ) {
170129 try (var ignored = new WithNocache (this , disableCache )) {
171- parse_pow ();
130+ assertInfixParsesTo ("1.2**9.1" , POW_PREC ,
131+ new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )));
132+ assertInfixParsesTo ("1.2**9.1**.3" , POW_PREC ,
133+ new PowOperation (new BasicDoubleSymbol (1.2 ), new PowOperation (new BasicDoubleSymbol (9.1 ), new BasicDoubleSymbol (.3 ))));
134+ assertInfixParsesTo ("1.2**9.1+.3" , ADD_PREC ,
135+ new AddOperation (new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )), new BasicDoubleSymbol (.3 )));
136+ assertInfixParsesTo (CommonData .getBigData3Pow_minimumParens (), ADD_PREC );
137+ assertInfixParsesTo (CommonData .getBigData3Pow_groupingParens (), ADD_PREC );
172138 }
173139 }
174140
175141 @ ParameterizedTest
176142 @ ValueSource (booleans ={true , false })
177- void parsePrecedenceLevel_nocache (boolean disableCache ) {
178- try (var ignored = new WithNocache (this , disableCache )) {
179- parsePrecedenceLevel ();
143+ void parse_pow (boolean disableCache ) {
144+ try (var ignored = new WithNocache (this , disableCache ).start ()) {
145+ assertParsesTo ("1.2**9.1" ,
146+ new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )));
147+ assertParsesTo ("1.2**9.1**.3" ,
148+ new PowOperation (new BasicDoubleSymbol (1.2 ), new PowOperation (new BasicDoubleSymbol (9.1 ), new BasicDoubleSymbol (.3 ))));
149+ assertParsesTo ("1.2**9.1+.3" ,
150+ new AddOperation (new PowOperation (new BasicDoubleSymbol (1.2 ), new BasicDoubleSymbol (9.1 )), new BasicDoubleSymbol (.3 )));
151+ assertParsesTo (CommonData .getBigData3Pow_minimumParens ());
152+ assertParsesTo (CommonData .getBigData3Pow_groupingParens ());
180153 }
181154 }
182155
@@ -186,20 +159,22 @@ static class WithNocache implements AutoCloseable {
186159 ParserTest inst ;
187160
188161 WithNocache (ParserTest inst_ ) {
189- inst = inst_ ;
190- start ();
162+ this (inst_ , true );
191163 }
192164 WithNocache (ParserTest inst_ , boolean doDisable_ ) {
193165 inst = inst_ ;
194166 doDisable = doDisable_ ;
195- start ();
196167 }
197-
168+
198169 @ Contract ("->this" )
199170 public WithNocache start () {
171+ _start ();
172+ return this ;
173+ }
174+
175+ private void _start () {
200176 origNocache = inst .nocache ;
201177 inst .nocache = doDisable ;
202- return this ;
203178 }
204179
205180 public void close () {
@@ -235,12 +210,11 @@ public void close() {
235210 Map <SymbolInfo , Optional <BinOpBiConstructor <?>>> origCache = new HashMap <>();
236211 void clearCache () {
237212 Field cacheField = getBiConstructorCache ();
238-
239- origCache = Arrays .stream (SymbolInfo .values ()).<Entry <SymbolInfo , Optional <BinOpBiConstructor <?>>>>map (sym -> {
213+ origCache = Arrays .stream (SymbolInfo .values ()).map (sym -> {
240214 try {
241215 @ Nullable BinOpBiConstructor <?> cachedValue = (BinOpBiConstructor <?>)cacheField .get (sym );
242216 cacheField .set (sym , null );
243- return Util .makeEntry (sym , Optional .ofNullable (cachedValue ));
217+ return Util .makeEntry (sym , Optional .< BinOpBiConstructor <?>> ofNullable (cachedValue ));
244218 } catch (IllegalAccessException e ) {
245219 throw Util .excToError (e );
246220 }
0 commit comments