/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */

/*
 *   ECMA-262 6th Edition / Draft November 8, 2013
 *
 *   20.2.2 Function Properties of the Math Object
 */

/*
 * This custom object will allow us to check if valueOf() is called
 */

TestNumber.prototype = new Number();

function TestNumber(value) {
    this.value = value;
    this.valueOfCalled = false;
}

TestNumber.prototype = {
    valueOf: function() {
        this.valueOfCalled = true;
        return this.value;
    }
}

// Verify that each TestNumber's flag is set after calling Math func
function test(func /*, args */) {
    var args = Array.prototype.slice.call(arguments, 1);
    func.apply(null, args);

    for (var i = 0; i < args.length; ++i)
        assertEq(args[i].valueOfCalled, true);
}

// Note that we are not testing these functions' return values
// We only test whether valueOf() is called for each argument

// 1. Test Math.atan2()
var x = new TestNumber(1);
test(Math.atan2, x);

var x = new TestNumber(1);
var y = new TestNumber(2);
test(Math.atan2, y, x);

// Remove comment block once patch for bug 896264 is approved
/*
// 2. Test Math.hypot()
var x = new TestNumber(1);
test(Math.hypot, x);

var x = new TestNumber(1);
var y = new TestNumber(2);
test(Math.hypot, x, y);

var x = new TestNumber(1);
var y = new TestNumber(2);
var z = new TestNumber(3);
test(Math.hypot, x, y, z);
*/

// Remove comment block once patch for bug 808148 is approved
/*
// 3. Test Math.imul()
var x = new TestNumber(1);
test(Math.imul, x);

var x = new TestNumber(1);
var y = new TestNumber(2);
test(Math.imul, x, y);
*/

// 4. Test Math.max()
var x = new TestNumber(1);
test(Math.max, x);

var x = new TestNumber(1);
var y = new TestNumber(2);
test(Math.max, x, y);

var x = new TestNumber(1);
var y = new TestNumber(2);
var z = new TestNumber(3);
test(Math.max, x, y, z);

// 5. Test Math.min()
var x = new TestNumber(1);
test(Math.min, x);

var x = new TestNumber(1);
var y = new TestNumber(2);
test(Math.min, x, y);

var x = new TestNumber(1);
var y = new TestNumber(2);
var z = new TestNumber(3);
test(Math.min, x, y, z);

// 6. Test Math.pow()
var x = new TestNumber(1);
test(Math.pow, x);

var x = new TestNumber(1);
var y = new TestNumber(2);
test(Math.pow, x, y);

reportCompare(0, 0, "ok");

