//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

// ES6 Object.is(x,y) API extension tests -- verifies the API shape and basic functionality

WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");

var tests = [
    {
        name: "Object.assign should exist and have length 2",
        body: function () {
            assert.isTrue(Object.hasOwnProperty('assign'), "Object should have an assign method");
            assert.areEqual(2, Object.assign.length, "assign method takes two arguments");
        }
    },
    {
        name: "Object.assign(o1, ...) should call ToObject on its sources",
        body: function () {
            assert.areEqual({}, Object.assign(1), "Call ToObject on target");
            assert.areEqual({}, Object.assign(1, 2, 3), "Call ToObject on target and sources");
            assert.areEqual({}, Object.assign({}, 2, 3), "Call ToObject on sources");
        }
    },

    {
        name: "Object.assign(object, null) and Object.assign(object, undefined) are no-op",
        body: function () {
            assert.areEqual({ a: 1 }, Object.assign({ a: 1 }, undefined), "Passing undefined as nextSource in assign method is a no-op");
            assert.areEqual({ a: 1 }, Object.assign({ a: 1 }, null), "Passing null as nextSource in assign method is a no-op");
        }
    },
    {
        name: "Object.assign(target) returns target",
        body: function () {
            var o = {x:10, y:20, z:30}
            assert.isTrue(o === Object.assign(o), "Object.assign(target) should return the same object");
            assert.isTrue(o === Object.assign(o, { a: 1 }), "Object.assign(target, source) should return the same object");
            assert.isTrue(o === Object.assign(o, { b: 2 }, { c: 3 }), "Object.assign(target, source1, source2) should return the same object");
        }
    },
    {
        name: "Object.assign({}, object) clone should work",
        body: function () {
            assert.areEqual({ a: 1 }, Object.assign({}, { a: 1 }), "Create a clone of a object");
            assert.areEqual([1], Object.assign({}, [1]), "Create a clone of a array");
            assert.areEqual(new String("hello"), Object.assign({}, new String("hello")), "Create a clone of a string");
        }
    },
    {
        name: "Object.assign(o1, o2, o3) Merging objects should work",
        body: function () {
            assert.areEqual({ a: 1, b: 2}, Object.assign({ a: 1 }, { b: 2 }), "Merging 2 plain objects should work");
            assert.areEqual({ a: 1, b: 2, c: 3 }, Object.assign({ a: 1 }, { b: 2 }, { c: 3 }), "Merging 3 plain objects should work");
            assert.areEqual({ a: 1, b: 2, c: 3, d: 4 }, Object.assign({ a: 1 }, { b: 2 }, { c: 3 }, { d: 4 }), "Merging 4 plain objects should work");
        }
    },
    {
        name: "Object.assign(o1, o2, o3) overlapping property names should preference last set",
        body: function () {
            assert.areEqual({ a: 2 }, Object.assign({ a: 1 }, { a: 2 }), "Merging 2 plain objects with the overlapping property name should work");
            assert.areEqual({ a: 1, b: 2, c: 3, z: 3 }, Object.assign({ a: 1, z: 1 }, { b: 2, z: 2 }, { c: 3, z: 3 }), "Merging 3 plain objects with overlapping property name should work");
        }
    },
    {
        name: "Object.assign(o1, o2) throw exception if GetOwnProperty for any enumerable property in o2 if enumeration fails",
        body: function () {
            try
            {
                Object.assign({}, { get x() { throw "xyz"; } });
                assert.fail("Exception is not thrown when GetOwnProperty fails");
            }
            catch (e)
            {
            }
        }
    },
    {
        name: "Object.assign(o1, o2) exception if SetProperty for any enumerable property in o2 if enumeration fails",
        body: function () {
            try {
                Object.assign({ set x(a) { throw "xyz"; } }, { x: 10 });
                assert.fail("Exception is not thrown when SetProperty fails");
            }
            catch (e) {
            }
        }
    },
    {
        name: "Object.assign(o1, o2, o2) should work on undefined values",
        body: function () {
            assert.areEqual({x: undefined}, Object.assign({}, {x : 40}, { x: undefined }), "Undefined values for the property keys are propagated");
        }
    },
    {
        name: "Object.assign(o1, o2, o2) ignore non-enumerable values",
        body: function () {
            var o2 = { y: 40 };
            Object.defineProperty(o2, "x", {value: 50, enumerable:false})
            assert.areEqual({y: 40}, Object.assign({}, o2), "Non enumerable values are not ignored");
        }
    },
    {
        name: "Object.assign(Object.create(Array.prototype), o2) create pattern",
        body: function () {
            assert.areEqual({ x: 10, y: 40 }, Object.assign(Object.create(Array.prototype), { x: 10, y: 40 }), "Object.create pattern should work ");
        }
    },
    {
        name: "Object.assign(o1, o2) works for symbols",
        body: function () {
            var o2 = {};
            var y = Symbol("y");
            o2[y] = 10;
            assert.isTrue((Object.assign({}, o2))[y] === 10, "Symbols are assigned to target object ");
            assert.isTrue((Object.assign({a:1}, o2))[y] === 10, "Symbols are assigned to target object (for non-empty assignee)");
            assert.isTrue((Object.assign({a:1}, o2))[y] === 10, "Symbols are assigned to target object (when hitting cache)");
        }
    },
    {
        name: "Object.assign(o1, o2) works for index properties",
        body: function () {
            assert.areEqual([1, 2, 3], Object.assign([], [1, 2, 3]), "Indexed properties are assigned to the target object");
        }
    },
    {
        name: "Object.assign(o1, o2) exception if SetProperty fails due to preventExtentions on o1",
        body: function () {
                assert.throws((function() { 'use strict'; var o = Object.preventExtensions([,0]);Object.assign(o,'xo');}), TypeError, "Invalid operand to 'Object.assign': Object expected");
        }
    },
    {
        name: "OS Bug 3080673: Object.assign(o1, o2) exception if SetProperty fails due to non-writable on o1 when o1's value is a String",
        body: function () {
            assert.throws((function() {
                    var o1 = "aaa";
                    var o2 = "babbb";
                    Object.assign(o1, o2);
            }), TypeError, "Exception is not thrown when SetProperty fails", "Cannot modify non-writable property '0'");
        }
    },

];

testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });
