blob: 8ff52f6e309d25cfe84a1506f0d90f893eb77492 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
var actual = [];
function UpdateActual(v)
{
Update(actual, v);
}
function Update(arr, value)
{
arr[arr.length] = value;
}
function CreateObjects()
{
return {
objectNoProps : {},
objectOneProp : { a : 1 },
objectSDTH : { a1: 1, a2:2, a3:3, a4:4, a5:5, a6:6, a7:7, a8:8, a9:9, a10:10, a11:11, a12:12, a13:13, a14:14, a15:15, a16:16, a17:17 }, // SimpleDictionaryTypeHandler
objectWithArr : { a : 1, 0 : 0},
objectCreate : Object.create(null),
"arr " : [],
"func " : function(x, y) {},
"regex " : /abc/g,
"date " : new Date()
}
}
var propertyProviders = {
"doNothing " : function(o) { },
"addOneProp " : function(o) { o.b = 0 },
"addTwoProps" : function(o) { o.b = 0; o.c = 0; },
"addIndex " : function(o) { o[2] = 0; }
};
var propertiesToTest = {
"numeric " : 2,
"nonNumeric" : "foo"
};
function defineAccessors(obj, prop)
{
Object.defineProperty(obj, prop, {
get: function() { UpdateActual("get"); return "getValue";},
set: function(v) { UpdateActual("set"); }
});
}
function defineNonWritable(obj, prop)
{
Object.defineProperty(obj, prop, {
writable : false,
value : "protoValue"
});
}
function defineAndFreeze(obj, prop)
{
obj[prop] = "protoValue";
Object.freeze(obj);
}
function defineAndSeal(obj, prop)
{
obj[prop] = "origProtoValue";
Object.seal(obj);
Object.defineProperty(obj, prop, {
writable : false,
value : "protoValue"
});
}
var definers = {
"setter " : defineAccessors,
"nonWritable" : defineNonWritable,
"freezer " : defineAndFreeze,
"sealer " : defineAndSeal
};
var preparers = {
"newProp " : function(o, prop) {},
"existingProp" : function(o, prop) { o[prop] = "toBeOverwritten"; }
}
var testNum = 1;
for (var definerKey in definers)
{
for (var providerKey in propertyProviders)
{
for (var propKey in propertiesToTest)
{
for (var i = 0; i <= 1; i++)
{
for (var prepKey in preparers)
{
var objects = CreateObjects();
for (var objKey in objects)
{
var shadow = (i === 0);
var description = "Test " + testNum++ + ": " + definerKey + ", " + objKey + ", " + providerKey + ", " + propKey + ", " + prepKey +
", shadow=" + shadow;
WScript.Echo(description);
actual = [];
var define = definers[definerKey];
var proto = objects[objKey];
var prop = propertiesToTest[propKey];
var provider = propertyProviders[providerKey];
var prepare = preparers[prepKey];
provider(proto);
var subProto = Object.create(proto);
var base = Object.create(subProto);
if (shadow)
{
subProto[prop] = "shadowValue";
}
prepare(proto, prop);
define(proto, prop);
base[prop] = "baseValue";
var v = base[prop];
UpdateActual(v);
var isSetter = (definerKey.indexOf("setter") >= 0);
var expected = [];
if (isSetter && !shadow)
{
Update(expected, "set");
Update(expected, "get");
}
if (shadow)
{
Update(expected, "baseValue");
}
else if (isSetter)
{
Update(expected, "getValue");
}
else
{
Update(expected, "protoValue");
}
var failed = false;
if (actual.length != expected.length)
{
failed = true;
}
else
{
for (var k = 0; k < actual.length; k++)
{
if (actual[k] !== expected[k])
{
failed = true;
break;
}
}
}
if (failed)
{
WScript.Echo("FAILED: " + description);
WScript.Echo("Expected: " + ArrayToString(expected));
WScript.Echo("Actual: " + ArrayToString(actual));
}
else
{
WScript.Echo("PASS");
}
}
}
}
}
}
}
function ArrayToString(arr)
{
var str = "";
while (arr.length > 0)
{
str += arr.shift();
}
return str;
}