# HG changeset patch # User Rik # Date 1300466248 25200 # Node ID 9f926b9f83cc8cba2826e0b2f4766a83a7bb355e # Parent c2e8c9d9e284e50783c26f0800843a5ad38567bd Add operator precedence tests to fixed list of parser tests. diff -r c2e8c9d9e284 -r 9f926b9f83cc test/ChangeLog --- a/test/ChangeLog Thu Mar 17 23:11:47 2011 -0700 +++ b/test/ChangeLog Fri Mar 18 09:37:28 2011 -0700 @@ -1,3 +1,7 @@ +2010-03-18 Rik + + * test_parser.m: Add operatore precedence tests. + 2010-03-01 Rik * test/test_index-wfi-t.m: Use modern warning function diff -r c2e8c9d9e284 -r 9f926b9f83cc test/test_parser.m --- a/test/test_parser.m Thu Mar 17 23:11:47 2011 -0700 +++ b/test/test_parser.m Fri Mar 18 09:37:28 2011 -0700 @@ -27,3 +27,143 @@ %!assert ({1 2,{3 4}}, {1,2,{3,4}}) %!assert ({1 2,{3,4}}, {1,2,{3,4}}) %!assert ({1,2,{3 4}}, {1,2,{3,4}}) + +%# Tests for operator precedence as documented in section 8.8 of manual +%# There are 11 levels of precedence from "exponentiation" (highest) down to +%# "statement operators" (lowest). +%# +%# Level 11 (exponentiation) overrides all others +%!test +%! assert (-2^2, -4) +%! assert (!0^0, false); +# FIXME: This test is failing. Transpose mistakenly has higher priority. +%! assert ([2 3].^2', [4; 9]) +%! 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 (1 && 0^0, true) +%! a = 3; +%! a *= 0^0; +%! assert (a, 3) +%# Level 10 (unary plus, increment, not) +%!test +# FIXME: No test for increment and transpose that I can think of. +%! a = 2; +%! assert (++a*3, 9) +%! assert (a++-2, 1) +%! assert (a, 4) +%! assert ([1:10](1:++a), [1:5]) +%! assert (5 == a++, true) +%! assert (7 == ++a, true) +%! a = 0; +%! assert (1 & a++, false) +%! assert (a, 1) +%! assert (1 && --a, false) +%! a = 3; +%! a *= a++; +%! assert (a, 12) +%# Level 9 (transpose) +%!test +%! assert ([1 2]*[3 4]', 11) +%! assert ([1 2]'+[3 4]', [4; 6]) +%! assert (1:5', 1:5) +%! assert ([1; 2] == [1 2]', [true; true]) +%! assert ([1; 0] & [1 0]', [true; false]) +# FIXME: No test for transpose and short-circuit operator that I can think of. +%! a = [1 2]; +%! a *= [3 4]'; +%! assert (a, 11) +%# Level 8 (multiply, divide) +%!test +%! assert (3 + 4 * 5, 23) +%! 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, false) +%! a = 3; +%! a /= a * 2; +%! assert (a, 0.5) +%# Level 7 (add, subtract) +%!test +%! assert ([2 + 1:6], 3:6) +%! assert (3 > 1 + 5, false) +%! assert (1 & 1 - 1, false) +%! assert (1 && 1 - 1, false) +%! a = 3; +%! a *= 1 + 1; +%! assert (a, 6) +%# Level 6 (colon) +%!test +%! assert (5:-1: 3 > 4, [true false false]) +%! assert (1: 3 & 1, [true true true]) +%! assert (-1: 3 && 1, false) +%! a = [1:3]; +%! a += 3 : 5; +%! assert (a, [4 6 8]) +%# Level 5 (relational) +%!test +%! assert (0 == -1 & 0, false) +%! assert (0 == -1 && 0, false) +%! a = 2; +%! a *= 3 > 1; +%! assert (a, 2) +%# Level 4 (element-wise and, or) +%!test +%! assert (0 & 1 || 1, true) +%! assert (0 == -1 && 0, false) +%! a = 2; +%! a *= 3 & 1; +%! assert (a, 2) +%# Level 3 (logical and, or) +%!test +%! a = 2; +%! a *= 3 && 1; +%! assert (a, 2) + +%# Tests for operator precedence within each level where ordering should +%# be left to right except for exponents and assignments. +%# Level 11 (exponentiation) +%!test +%# FIXME : Exponentiation seems to work left to right, despite the +%# documentation and ordinary mathematical rules of precedence. +%! assert (2^3**2, 512) +%# Level 10 (unary plus, increment, not) +%!test +%! assert (+-+1, -1) +%! a = 0; +%# FIXME : Should we test for this corner case at all? +%# (unary minus)(auto-decrement operator) +%! assert (---a, 1); +%! a = -1; +%! assert (!++a, true) +%! assert (a, 0) +%! assert (-~a, -1) +%! assert (!~a++, false) +%! assert (a, 1) +%# Level 9 (transpose) +%!test +%! assert (3*4i'.', 0 - 12i) +%! assert (3*4i.'.', 0 + 12i) +%# Level 8 (multiply, divide) +%!test +%!assert (3 * 4 / 5, 2.4) +%!assert (3 ./ 4 .* 5, 3.75) +%# Level 7 (add, subtract) +%!test +%!assert (-3 - 4 + 1 + 3 * 2, 0) +%# Level 5 (relational) +%!test +%! assert (0 < 1 <= 0.5 == 0 >= 0.5 > 0, true) +%! assert (1 < 1 == 0 != 0, true) +%! assert (1 < 1 == 0 ~= 0, true) +%# Level 4 (element-wise and, or) +%!test +%! assert ([ 1 0] & [0 1] | [1 0], [true false]) +%# Level 2 (assignment) +%!test +%! a = 2; b = 5; c = 7; +%! assert (a += b *= c += 1, 42) +%! assert (b == 40 && c == 8)