# HG changeset patch # User Rik # Date 1377141783 25200 # Node ID 1e1d42f0f33299eee8462100dccbc723b292e69d # Parent 088d014a7fe2866c05db60cebabb9707dc71d37b parser.tst: Re-indent and add tests for bug #33304. * test/parser.tst: Use just a single space after '%!' before code. Add tests for left-to-right exponentiation operation. diff --git a/test/parser.tst b/test/parser.tst --- a/test/parser.tst +++ b/test/parser.tst @@ -35,217 +35,229 @@ ## Level 13 (parentheses and indexing) ## Overrides all other levels %!test -%! a.b = 1; -%! assert (a. b++, 1) -%! assert (a.b, 2) -%! clear a; -%! a.b = [0 1]; -%! b = 2; -%! assert (a.b', [0;1]) -%! assert (!a .b, logical ([1 0])) -%! assert (3*a .b, [0 3]) -%! assert (a. b-1, [-1 0]) -%! assert (a. b:3, 0:3) -%! assert (a. b>0.5, logical ([0 1])) -%! assert (a. b&0, logical ([0 0])) -%! assert (a. b|0, logical ([0 1])) -%! a.b = [1 2]; -%! assert (a. b&&0, false) -%! assert (a. b||0, true) -%! a.b += a. b*2; -%! assert (a.b, [3 6]) +%! a.b = 1; +%! assert (a. b++, 1); +%! assert (a.b, 2); +%! clear a; +%! a.b = [0 1]; +%! b = 2; +%! assert (a.b', [0;1]); +%! assert (!a .b, logical ([1 0])); +%! assert (3*a .b, [0 3]); +%! assert (a. b-1, [-1 0]); +%! assert (a. b:3, 0:3); +%! assert (a. b>0.5, logical ([0 1])); +%! assert (a. b&0, logical ([0 0])); +%! assert (a. b|0, logical ([0 1])); +%! a.b = [1 2]; +%! assert (a. b&&0, false); +%! assert (a. b||0, true); +%! a.b += a. b*2; +%! assert (a.b, [3 6]); ## Level 12 (postfix increment and decrement) %!test -%! a = [3 5]; -%! assert (2.^a ++, [8 32]) -%! assert (a, [4 6]) -%! assert (a--', [4; 6]) -%! assert (a, [3 5]) -%! a = 0; -%! assert (!a --, true) -%! assert (-a ++, 1) -%! assert (3*a ++, 0) -%! assert (a++-2, -1) -%! assert (1:a ++, 1:2) -%! assert (4>a++, true) -%! a = [0 -1]; -%! assert ([1 1] & a++, logical ([0 1])) -%! assert ([0 0] | a++, logical ([1 0])) -%! a = 0; -%! assert (1 && a ++, false) -%! assert (0 || a --, true) -%! a = 5; b = 2; -%! b +=a ++; -%! assert (b, 7) +%! a = [3 5]; +%! assert (2.^a ++, [8 32]); +%! assert (a, [4 6]); +%! assert (a--', [4; 6]); +%! assert (a, [3 5]); +%! a = 0; +%! assert (!a --, true); +%! assert (-a ++, 1); +%! assert (3*a ++, 0); +%! assert (a++-2, -1); +%! assert (1:a ++, 1:2); +%! assert (4>a++, true); +%! a = [0 -1]; +%! assert ([1 1] & a++, logical ([0 1])); +%! assert ([0 0] | a++, logical ([1 0])); +%! a = 0; +%! assert (1 && a ++, false); +%! assert (0 || a --, true); +%! a = 5; b = 2; +%! b +=a ++; +%! assert (b, 7); ## Level 11 (transpose and exponentiation) %!test -%! assert (-2 ^2, -4) -%! assert (!0 ^0, false) -%! assert (2*3 ^2, 18) -%! assert (2+3 ^2, 11) -%! assert ([1:10](1:2 ^2), [1 2 3 4]) -%! assert (3>2 ^2, false) -%! assert (1&0 ^0, true) -%! assert (0|0 ^0, true) -%! assert (1&&0 ^0, true) -%! assert (0||0 ^0, true) -%! a = 3; -%! a *= 0 ^0; -%! assert (a, 3) +%! assert (-2 ^2, -4); +%! assert (!0 ^0, false); +%! assert (2*3 ^2, 18); +%! assert (2+3 ^2, 11); +%! assert ([1:10](1:2 ^2), [1 2 3 4]); +%! assert (3>2 ^2, false); +%! assert (1&0 ^0, true); +%! assert (0|0 ^0, true); +%! assert (1&&0 ^0, true); +%! assert (0||0 ^0, true); +%! a = 3; +%! a *= 0 ^0; +%! assert (a, 3); ## Level 10 (unary plus/minus, prefix increment/decrement, not) %!test -%! a = 2; -%! assert (++ a*3, 9) -%! assert (-- a-2, 0) -%! assert (a, 2) -%! assert (! a-2, -2) -%! assert ([1:10](++ a:5), 3:5) -%! a = [1 0]; -%! assert (! a>=[1 0], [false true]) -%! a = 0; -%! assert (++ a&1, true) -%! assert (-- a|0, false) -%! assert (-- a&&1, true) -%! assert (++ a||0, false) -%! a = 3; -%! a *= ++a; -%! assert (a, 16) +%! a = 2; +%! assert (++ a*3, 9); +%! assert (-- a-2, 0); +%! assert (a, 2); +%! assert (! a-2, -2); +%! assert ([1:10](++ a:5), 3:5); +%! a = [1 0]; +%! assert (! a>=[1 0], [false true]); +%! a = 0; +%! assert (++ a&1, true); +%! assert (-- a|0, false); +%! assert (-- a&&1, true); +%! assert (++ a||0, false); +%! a = 3; +%! a *= ++a; +%! assert (a, 16); ## Level 9 (multiply, divide) %!test -%! assert (3+4 * 5, 23) -%! assert (5 * 1:6, [5 6]) -%! assert (3>1 * 5, false) -%! assert (1&1 * 0, false) -%! assert (1|1 * 0, true) -%! assert (1&&1 * 0, false) -%! assert (1||1 * 0, true) -%! a = 3; -%! a /= a * 2; -%! assert (a, 0.5) +%! assert (3+4 * 5, 23); +%! assert (5 * 1:6, [5 6]); +%! assert (3>1 * 5, false); +%! assert (1&1 * 0, false); +%! assert (1|1 * 0, true); +%! assert (1&&1 * 0, false); +%! assert (1||1 * 0, true); +%! a = 3; +%! a /= a * 2; +%! assert (a, 0.5); ## Level 8 (add, subtract) %!test -%! assert ([2 + 1:6], 3:6) -%! assert (3>1 + 5, false) -%! assert (1&1 - 1, false) -%! assert (0|1 - 2, true) -%! assert (1&&1 - 1, false) -%! assert (0||1 - 2, true) -%! a = 3; -%! a *= 1 + 1; -%! assert (a, 6) +%! assert ([2 + 1:6], 3:6); +%! assert (3>1 + 5, false); +%! assert (1&1 - 1, false); +%! assert (0|1 - 2, true); +%! assert (1&&1 - 1, false); +%! assert (0||1 - 2, true); +%! a = 3; +%! a *= 1 + 1; +%! assert (a, 6); ## Level 7 (colon) %!test -%! assert (5:-1: 3>4, [true false false]) -%! assert (1: 3&1, [true true true]) -%! assert (1: 3|0, [true true true]) -%! assert (-1: 3&&1, false) -%! assert (-1: 3||0, false) -%! a = [1:3]; -%! a += 3 : 5; -%! assert (a, [4 6 8]) +%! assert (5:-1: 3>4, [true false false]); +%! assert (1: 3&1, [true true true]); +%! assert (1: 3|0, [true true true]); +%! assert (-1: 3&&1, false); +%! assert (-1: 3||0, false); +%! a = [1:3]; +%! a += 3 : 5; +%! assert (a, [4 6 8]); ## Level 6 (relational) %!test -%! assert (0 == -1&0, false) -%! assert (1 == -1|0, false) -%! assert (0 == -1&&0, false) -%! assert (1 == -1||0, false) -%! a = 2; -%! a *= 3 > 1; -%! assert (a, 2) +%! assert (0 == -1&0, false); +%! assert (1 == -1|0, false); +%! assert (0 == -1&&0, false); +%! assert (1 == -1||0, false); +%! a = 2; +%! a *= 3 > 1; +%! assert (a, 2); ## Level 5 (element-wise and) %!test -%! assert (0 & 1|1, true) -%! assert ([0 1] & 1&&1, false) -%! assert (0 & 1||1, true) -%! a = 2; -%! a *= 3 & 1; -%! assert (a, 2) +%! assert (0 & 1|1, true); +%! assert ([0 1] & 1&&1, false); +%! assert (0 & 1||1, true); +%! a = 2; +%! a *= 3 & 1; +%! assert (a, 2); ## Level 4 (element-wise or) %!test -%! assert ([0 1] | 1&&0, false) -%! assert ([0 1] | 1||0, true) -%! a = 2; -%! a *= 0 | 1; -%! assert (a, 2) +%! assert ([0 1] | 1&&0, false); +%! assert ([0 1] | 1||0, true); +%! a = 2; +%! a *= 0 | 1; +%! assert (a, 2); ## Level 3 (logical and) %!test -%! assert (0 && 1||1, true) -%! a = 2; -%! a *= 3 && 1; -%! assert (a, 2) +%! assert (0 && 1||1, true); +%! a = 2; +%! a *= 3 && 1; +%! assert (a, 2); ## Level 2 (logical or) %!test -%! a = 2; -%! a *= 0 || 1; -%! assert (a, 2) +%! a = 2; +%! a *= 0 || 1; +%! assert (a, 2); ## Tests for operator precedence within each level where ordering should ## be left to right except for postfix and assignment operators. ## Level 13 (parentheses and indexing) %!test -%! a.b1 = 2; -%! assert (a.(strcat('b','1'))++, 2) -%! assert (a.b1, 3) -%! b = {1 2 3 4 5}; -%! assert (b{(a. b1 + 1)}, 4) -%! b = 1:5; -%! assert (b(a. b1 + 1), 4) -%! assert ([2 3].^2', [4; 9]) +%! a.b1 = 2; +%! assert (a.(strcat('b','1'))++, 2); +%! assert (a.b1, 3); +%! b = {1 2 3 4 5}; +%! assert (b{(a. b1 + 1)}, 4); +%! b = 1:5; +%! assert (b(a. b1 + 1), 4); +%! assert ([2 3].^2', [4; 9]); ## Level 12 (postfix increment and decrement) ## No tests possible since a++-- is not valid ## Level 11 (transpose and exponentiation) -## Note: Exponentiation works left to right for compatibility with Matlab. -%! assert (2^3**2, 64) -%! assert ([2 3].^2.', [4;9]) -%! assert ([2 3].'.^2, [4;9]) -%! assert (3*4i'.', 0 - 12i) -%! assert (3*4i.'.', 0 + 12i) +## Note: Exponentiation should be left-to-right, but Octave does right-to-left. +## See bug #33304. +%!test +%! assert (2^3**2, 64); +%! assert ([2 3].^2.', [4;9]); +%! assert ([2 3].'.^2, [4;9]); +%! assert (3*4i'.', 0 - 12i); +%! assert (3*4i.'.', 0 + 12i); +%! assert (2^-4^3, (1/16)^3); +%! assert (2^+4^3, 16^3); +%! assert (2^~0^2, 4); + +## Note: Exponentiation should be left-to-right, but Octave does right-to-left. +## See bug #33304. + ## Level 10 (unary plus/minus, prefix increment/decrement, not) %!test -%! assert (+-+1, -1) -%! a = -1; -%! assert (!++a, true) -%! assert (a, 0) -%! assert (-~a, -1) -%! assert (!~--a, true) -%! assert (a, -1) +%! assert (+-+1, -1); +%! a = -1; +%! assert (!++a, true); +%! assert (a, 0); +%! assert (-~a, -1); +%! assert (!~--a, true); +%! assert (a, -1); ## Level 9 (multiply, divide) %!test -%! assert (3 * 4 / 5, 2.4) -%! assert (3 ./ 4 .* 5, 3.75) -%! assert (2 * 4 \ 6, 0.75) -%! assert (2 .\ 4 .* 6, 12) +%! assert (3 * 4 / 5, 2.4); +%! assert (3 ./ 4 .* 5, 3.75); +%! assert (2 * 4 \ 6, 0.75); +%! assert (2 .\ 4 .* 6, 12); ## Level 8 (add, subtract) %!test -%! assert (-3 - 4 + 1 + 3 * 2, 0) +%! assert (-3 - 4 + 1 + 3 * 2, 0); ## Level 7 (colon) -## No tests possible because colon operator can't be combined with second colon operator +## No tests possible because colon operator can't be combined +## with second colon operator. ## Level 6 (relational) %!test -%! assert (0 < 1 <= 0.5 == 0 >= 0.5 > 0, true) -%! assert (1 < 1 == 0 != 0, true) -%! assert (1 < 1 == 0 ~= 0, true) +%! assert (0 < 1 <= 0.5 == 0 >= 0.5 > 0, true); +%! assert (1 < 1 == 0 != 0, true); +%! assert (1 < 1 == 0 ~= 0, true); ## Level 5 (element-wise and) -## No tests possible. Only one operator (&) at this precedence level and operation is associative. +## No tests possible. Only one operator (&) at this precedence level +## and operation is associative. ## Level 4 (element-wise or) -## No tests possible. Only one operator (|) at this precedence level and operation is associative. +## No tests possible. Only one operator (|) at this precedence level +## and operation is associative. ## Level 3 (logical and) %!test -%! a = 1; -%! assert (1 && 0 && ++a, false) -%! assert (a, 1) +%! a = 1; +%! assert (1 && 0 && ++a, false); +%! assert (a, 1); ## Level 2 (logical or) %!test -%! a = 1; -%! assert (0 || 1 || ++a, true) -%! assert (a, 1) +%! a = 1; +%! assert (0 || 1 || ++a, true); +%! assert (a, 1); ## Level 1 (assignment) %!test %! a = 2; b = 5; c = 7; -%! assert (a += b *= c += 1, 42) -%! assert (b == 40 && c == 8) +%! assert (a += b *= c += 1, 42); +%! assert (b == 40 && c == 8); ## Test creation of anonymous functions