trisquel-icecat/icecat/js/src/jsapi-tests
2026-01-17 18:56:47 -06:00
..
hidePointer.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
jsapi-tests-gdb.py.in icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
Makefile.in icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
moz.build icecat: add release icecat-140.6.0-1gnu1 for aramo 2026-01-17 18:56:47 -06:00
README icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
selfTest.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testAddPropertyPropcache.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testArgumentsObject.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testArrayBuffer.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testArrayBufferOrViewAPI.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testArrayBufferView.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testArrayBufferWithUserOwnedContents.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testAssemblerBuffer.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testAssemblerCodeGen.cpp icecat: add release icecat-140.6.0-1gnu1 for aramo 2026-01-17 18:56:47 -06:00
testAtomicOperations.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testAtomizeUtf8NonAsciiLatin1CodePoint.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testAtomizeWithoutActiveZone.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testAvlTree.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testBigInt.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testBoundFunction.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testBug604087.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testCallArgs.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testCallNonGenericMethodOnProxy.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testCharacterEncoding.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testChromeBuffer.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testCompileNonSyntactic.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testCompileScript.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testCompileUtf8.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testDateToLocaleString.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDebugger.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDeduplication.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testDeepFreeze.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDefineGetterSetterNonEnumerable.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDefineProperty.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDeflateStringToUTF8Buffer.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDeleteProperty.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDifferentNewTargetInvokeConstructor.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testDynamicCodeBrandChecks.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testEmptyWindowIsOmitted.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testErrorCopying.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testErrorInterceptor.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testErrorInterceptorGC.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testErrorLineOfContext.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testException.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testExecuteInJSMEnvironment.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testExternalStrings.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testFindSCCs.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testForceLexicalInitialization.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testForOfIterator.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testForwardSetProperty.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testFractionToDouble.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testFreshGlobalEvalRedefinition.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testFrontendCompileStencil.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testFrontendErrors.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testFrontendJSON.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testFunctionBinding.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testFunctionNonSyntactic.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testFunctionProperties.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testGCAllocator.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCCellPtr.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testGCChunkPool.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCExactRooting.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCFinalizeCallback.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCGrayMarking.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCHeapBarriers.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCHooks.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCMarking.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGCOutOfMemory.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testGCStoreBufferRemoval.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testGCUniqueId.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testGCWeakCache.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testGetPropertyDescriptor.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testHashTable.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testIndexToString.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testInformalValueTypeName.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testInt128.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testIntern.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testIntlAvailableLocales.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testIntString.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testIsCompilableUnit.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testIsInsideNursery.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testIsISOStyleDate.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testIteratorObject.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testJitABIcalls.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testJitDCEinGVN.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testJitFoldsTo.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testJitGVN.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testJitMacroAssembler.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testJitMinimalFunc.h icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testJitMoveEmitterCycles.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testJitRangeAnalysis.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testJitRegisterSet.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testJitRValueAlloc.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testJSEvaluateScript.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testJSON.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testLargeArrayBuffers.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testLinkedList.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testLookup.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testLooselyEqual.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testMappedArrayBuffer.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testMapSet.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testMemoryAssociation.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testMutedErrors.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testNewObject.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testNewTargetInvokeConstructor.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testNullRoot.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testNumberToString.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testObjectEmulatingUndefined.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testObjectSwap.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testObjectWithStashedPointer.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testOOM.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testParseJSON.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testParserAtom.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testPersistentRooted.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testPreserveJitCode.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testPrintError.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testPrintf.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testPrivateGCThingValue.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testProfileStrings.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testPromise.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testPropCache.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testPropertyKey.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testRegExp.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testResolveRecursion.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testResult.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
tests.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
tests.h icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSABAccounting.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testSameValue.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testSavedStacks.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testScriptInfo.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testScriptObject.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testScriptSourceCompression.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testSetProperty.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSetPropertyIgnoringNamedGetter.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSharedImmutableStringsCache.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testSinglyLinkedList.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testsJit.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testsJit.h icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSliceBudget.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSlowScript.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testSortedArenaList.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSourcePolicy.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSparseBitmap.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testStencil.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testStringBuffers.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testStringBuilder.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testStringIsArrayIndex.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testStructuredClone.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testSymbol.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testThreadingConditionVariable.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testThreadingExclusiveData.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testThreadingMutex.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testThreadingThread.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testToSignedOrUnsignedInteger.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testTypedArrays.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testUbiNode.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testUncaughtSymbol.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testUTF8.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testValueABI.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testWasmEncoder.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testWasmLEB128.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
testWasmMasm.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testWasmRefSubtypes.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testWasmReturnCalls.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testWeakMap.cpp icecat: add release 140.3.1-1gnu1 2025-10-06 02:35:48 -06:00
testWindowNonConfigurable.cpp icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00
valueABI.c icecat: initial release for Trisquel 12.0, Ecne 2025-07-17 09:32:21 -06:00

# JSAPI Test Suite

The tests in this directory exercise the JSAPI.


## Building and running the tests

If you built JS, you already built the tests.

The tests are built by default when you build JS. All the tests are compiled
into a single binary named jsapi-tests. They all run in a single process.
They must be run from the js/src directory.

To run the tests:

    $OBJDIR/dist/bin/jsapi-tests

To run the tests in a debugger:

    gdb $OBJDIR/dist/bin/jsapi-tests


## Creating new tests

1.  You can either add to an existing test*.cpp file or make a new one.
    Copy an existing test and replace the body with your test code.
    The test harness provides `cx`, `rt`, and `global` for your use.

2.  If you made a new .cpp file, add it to the UNIFIED_SOURCES list
    in moz.build.


## Writing test code

Here is a sample test:

    #include "jsapi-tests/tests.h"

    BEGIN_TEST(testIntString_bug515273)
    {
        RootedValue v(cx);

        EVAL("'42';", &v);
        JSString *str = v.toString();
        CHECK(JS_StringHasBeenInterned(cx, str));
        CHECK(JS_FlatStringEqualsLiteral(JS_ASSERT_STRING_IS_FLAT(str), "42"));
        return true;
    }
    END_TEST(testIntString_bug515273)

The BEGIN_TEST and END_TEST macros bracket each test. By convention, the test
name is <testFilename>_<detail>. (The above test is in testIntString.cpp.)

The curly braces are required. This block is the body of a C++ member function
that returns bool. The test harness calls this member function
automatically. If the function returns true, the test passes. False, it fails.

JSAPI tests often need extra global C/C++ code: a JSClass, a getter or setter
function, a resolve hook. Put these before the BEGIN_TEST macro.

The body of the test can use these member variables and macros, defined in
tests.h:

    JSRuntime *rt;
    JSContext *cx;
    JSObject *global;

        The test framework creates these fresh for each test. The default
        environment has reasonable default settings, including
        JSOPTION_VAROBJFIX, JSOPTION_JIT, a global object of a class with
        JSCLASS_GLOBAL_FLAGS, and an error reporter that prints to stderr.
        See also "Custom test setup" below.

    EXEC(const char *code);

        Execute some JS code in global scope, using JS::Evaluate. Return
        false if that fails. (This means that if the code throws an uncaught JS
        exception, the test fails.)

    EVAL(const char *code, jsval *vp);

        Same as EXEC, but store the result value in *vp.

    CHECK(bool cond);

        If the condition is not true, print an error message and return false,
        failing the test.

    CHECK_SAME(jsval a, jsval b);

        If a and b are different values, print an error message and return
        false, failing the test.

        This is like CHECK(sameValue(a, b)) but with a more detailed error
        message on failure. See sameValue below.

    CHECK_EQUAL(const T &a, const U &b);

        CHECK(a == b), but with a more detailed error message.

    CHECK_NULL(const T *ptr);

        CHECK(ptr == nullptr), but with a more detailed error message.

        (This is here because CHECK_EQUAL(ptr, nullptr) fails to compile on GCC
        2.5 and before.)


    bool knownFail;

        Set this to true if your test is known to fail. The test runner will
        print a TEST-KNOWN-FAIL line rather than a TEST-UNEXPECTED-FAIL
        line. This way you can check in a test illustrating a bug ahead of the
        fix.

        If your test actually crashes the process or triggers an assertion,
        this of course will not help, so you should add something like

            knownFail = true;  // see bug 123456
            return false;  // the code below crashes!

        as the first two lines of the test.

    bool isNegativeZero(jsval v);
    bool isNaN(jsval v);

        Self-explanatory.

    bool sameValue(jsval v1, jsval v2);

        True if v1 and v2 are the same value according to the ES5 SameValue()
        function, to wit:

        SameValue(NaN, NaN) is true.
        SameValue(-0, 0) is false.
        Otherwise SameValue(a, b) iff a === b.


## Custom test setup

Before executing each test, the test framework calls the tests' init() member
function, which populates the rt, cx, and global member variables.

A test can customize the test setup process by overloading virtual member
functions from the JSAPIRuntimeTest class, like this:

    const JSClass globalClassWithResolve = { ... };

    BEGIN_TEST(testGlobalResolveHook)
        {
            RootedValue v;
            EVAL("v", v.address());
            CHECK_SAME(v, JSVAL_VOID);
            return true;
        }

        // Other class members can go here.

        // This one overloads a base-class method.
        virtual JSClass *getGlobalJSClass() {
            return &globalClassWithResolve;
        }
    END_TEST(testGlobalResolveHook)

The overloadable member functions are:

    virtual bool init();
    virtual void uninit();
    virtual JSRuntime * createRuntime();
    virtual JSContext * createContext();
    virtual JSClass * getGlobalClass();
    virtual JSObject * createGlobal();