michael@0: function testMathMaxMin(aFun) { michael@0: var test_error = { name: "test" }; michael@0: test(function() { michael@0: assert_throws(test_error, function() { michael@0: Math[aFun](NaN, { michael@0: valueOf: function() { michael@0: throw test_error; michael@0: } michael@0: }); michael@0: }); michael@0: }, "ToNumber should be called on all arguments: NaN."); michael@0: test(function() { michael@0: assert_throws(test_error, function() { michael@0: Math[aFun](-Infinity, { michael@0: valueOf: function() { michael@0: throw test_error; michael@0: } michael@0: }); michael@0: }); michael@0: }, "ToNumber should be called on all arguments: -Infinity."); michael@0: test(function() { michael@0: assert_throws(test_error, function() { michael@0: Math[aFun](Infinity, { michael@0: valueOf: function() { michael@0: throw test_error; michael@0: } michael@0: }); michael@0: }); michael@0: }, "ToNumber should be called on all arguments: Infinity."); michael@0: test(function() { michael@0: assert_throws(test_error, function() { michael@0: Math[aFun]({ michael@0: valueOf: function() { michael@0: throw test_error; michael@0: } michael@0: }, michael@0: { michael@0: valueOf: function() { michael@0: throw 7; michael@0: } michael@0: }); michael@0: }); michael@0: }, "ToNumber should be called left to right."); michael@0: test(function() { michael@0: assert_equals(Math[aFun]("1"), 1); michael@0: }, "Should return a number."); michael@0: test(function() { michael@0: var expected = { michael@0: "max": 0, michael@0: "min": -0 michael@0: } michael@0: assert_equals(Math[aFun](0, -0), expected[aFun]); michael@0: assert_equals(Math[aFun](-0, 0), expected[aFun]); michael@0: assert_equals(Math[aFun](0, 0), 0); michael@0: assert_equals(Math[aFun](-0, -0), -0); michael@0: }, "Should handle negative zero correctly."); michael@0: }