/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "jsapi-tests/tests.h"

BEGIN_TEST(testObjectIsRegExp)
{
    JS::RootedValue val(cx);

    bool isRegExp;

    EVAL("new Object", &val);
    JS::RootedObject obj(cx, val.toObjectOrNull());
    CHECK(JS_ObjectIsRegExp(cx, obj, &isRegExp));
    CHECK(!isRegExp);

    EVAL("/foopy/", &val);
    obj = val.toObjectOrNull();
    CHECK(JS_ObjectIsRegExp(cx, obj, &isRegExp));
    CHECK(isRegExp);

    return true;
}
END_TEST(testObjectIsRegExp)

BEGIN_TEST(testGetRegExpFlags)
{
    JS::RootedValue val(cx);
    JS::RootedObject obj(cx);

    EVAL("/foopy/", &val);
    obj = val.toObjectOrNull();
    CHECK_EQUAL(JS_GetRegExpFlags(cx, obj), 0u);

    EVAL("/foopy/g", &val);
    obj = val.toObjectOrNull();
    CHECK_EQUAL(JS_GetRegExpFlags(cx, obj), JSREG_GLOB);

    EVAL("/foopy/gi", &val);
    obj = val.toObjectOrNull();
    CHECK_EQUAL(JS_GetRegExpFlags(cx, obj), (JSREG_FOLD | JSREG_GLOB));

    return true;
}
END_TEST(testGetRegExpFlags)

BEGIN_TEST(testGetRegExpSource)
{
    JS::RootedValue val(cx);
    JS::RootedObject obj(cx);

    EVAL("/foopy/", &val);
    obj = val.toObjectOrNull();
    JSString* source = JS_GetRegExpSource(cx, obj);
    CHECK(JS_FlatStringEqualsAscii(JS_ASSERT_STRING_IS_FLAT(source), "foopy"));

    return true;
}
END_TEST(testGetRegExpSource)
