js/src/jsapi-tests/testObjectEmulatingUndefined.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jsapi-tests/testObjectEmulatingUndefined.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,110 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +#include "jsapi-tests/tests.h"
     1.9 +
    1.10 +static const JSClass ObjectEmulatingUndefinedClass = {
    1.11 +    "ObjectEmulatingUndefined",
    1.12 +    JSCLASS_EMULATES_UNDEFINED,
    1.13 +    JS_PropertyStub,
    1.14 +    JS_DeletePropertyStub,
    1.15 +    JS_PropertyStub,
    1.16 +    JS_StrictPropertyStub,
    1.17 +    JS_EnumerateStub,
    1.18 +    JS_ResolveStub,
    1.19 +    JS_ConvertStub
    1.20 +};
    1.21 +
    1.22 +static bool
    1.23 +ObjectEmulatingUndefinedConstructor(JSContext *cx, unsigned argc, jsval *vp)
    1.24 +{
    1.25 +    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
    1.26 +    JSObject *obj = JS_NewObjectForConstructor(cx, &ObjectEmulatingUndefinedClass, args);
    1.27 +    if (!obj)
    1.28 +        return false;
    1.29 +    args.rval().setObject(*obj);
    1.30 +    return true;
    1.31 +}
    1.32 +
    1.33 +BEGIN_TEST(testObjectEmulatingUndefined_truthy)
    1.34 +{
    1.35 +    CHECK(JS_InitClass(cx, global, js::NullPtr(), &ObjectEmulatingUndefinedClass,
    1.36 +                       ObjectEmulatingUndefinedConstructor, 0,
    1.37 +                       nullptr, nullptr, nullptr, nullptr));
    1.38 +
    1.39 +    JS::RootedValue result(cx);
    1.40 +
    1.41 +    EVAL("if (new ObjectEmulatingUndefined()) true; else false;", &result);
    1.42 +    CHECK_SAME(result, JSVAL_FALSE);
    1.43 +
    1.44 +    EVAL("if (!new ObjectEmulatingUndefined()) true; else false;", &result);
    1.45 +    CHECK_SAME(result, JSVAL_TRUE);
    1.46 +
    1.47 +    EVAL("var obj = new ObjectEmulatingUndefined(); \n"
    1.48 +         "var res = []; \n"
    1.49 +         "for (var i = 0; i < 50; i++) \n"
    1.50 +         "  res.push(Boolean(obj)); \n"
    1.51 +         "res.every(function(v) { return v === false; });",
    1.52 +         &result);
    1.53 +    CHECK_SAME(result, JSVAL_TRUE);
    1.54 +
    1.55 +    return true;
    1.56 +}
    1.57 +END_TEST(testObjectEmulatingUndefined_truthy)
    1.58 +
    1.59 +BEGIN_TEST(testObjectEmulatingUndefined_equal)
    1.60 +{
    1.61 +    CHECK(JS_InitClass(cx, global, js::NullPtr(), &ObjectEmulatingUndefinedClass,
    1.62 +                       ObjectEmulatingUndefinedConstructor, 0,
    1.63 +                       nullptr, nullptr, nullptr, nullptr));
    1.64 +
    1.65 +    JS::RootedValue result(cx);
    1.66 +
    1.67 +    EVAL("if (new ObjectEmulatingUndefined() == undefined) true; else false;", &result);
    1.68 +    CHECK_SAME(result, JSVAL_TRUE);
    1.69 +
    1.70 +    EVAL("if (new ObjectEmulatingUndefined() == null) true; else false;", &result);
    1.71 +    CHECK_SAME(result, JSVAL_TRUE);
    1.72 +
    1.73 +    EVAL("if (new ObjectEmulatingUndefined() != undefined) true; else false;", &result);
    1.74 +    CHECK_SAME(result, JSVAL_FALSE);
    1.75 +
    1.76 +    EVAL("if (new ObjectEmulatingUndefined() != null) true; else false;", &result);
    1.77 +    CHECK_SAME(result, JSVAL_FALSE);
    1.78 +
    1.79 +    EVAL("var obj = new ObjectEmulatingUndefined(); \n"
    1.80 +         "var res = []; \n"
    1.81 +         "for (var i = 0; i < 50; i++) \n"
    1.82 +         "  res.push(obj == undefined); \n"
    1.83 +         "res.every(function(v) { return v === true; });",
    1.84 +         &result);
    1.85 +    CHECK_SAME(result, JSVAL_TRUE);
    1.86 +
    1.87 +    EVAL("var obj = new ObjectEmulatingUndefined(); \n"
    1.88 +         "var res = []; \n"
    1.89 +         "for (var i = 0; i < 50; i++) \n"
    1.90 +         "  res.push(obj == null); \n"
    1.91 +         "res.every(function(v) { return v === true; });",
    1.92 +         &result);
    1.93 +    CHECK_SAME(result, JSVAL_TRUE);
    1.94 +
    1.95 +    EVAL("var obj = new ObjectEmulatingUndefined(); \n"
    1.96 +         "var res = []; \n"
    1.97 +         "for (var i = 0; i < 50; i++) \n"
    1.98 +         "  res.push(obj != undefined); \n"
    1.99 +         "res.every(function(v) { return v === false; });",
   1.100 +         &result);
   1.101 +    CHECK_SAME(result, JSVAL_TRUE);
   1.102 +
   1.103 +    EVAL("var obj = new ObjectEmulatingUndefined(); \n"
   1.104 +         "var res = []; \n"
   1.105 +         "for (var i = 0; i < 50; i++) \n"
   1.106 +         "  res.push(obj != null); \n"
   1.107 +         "res.every(function(v) { return v === false; });",
   1.108 +         &result);
   1.109 +    CHECK_SAME(result, JSVAL_TRUE);
   1.110 +
   1.111 +    return true;
   1.112 +}
   1.113 +END_TEST(testObjectEmulatingUndefined_equal)

mercurial