mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-26 01:08:39 +09:00
| .. | ||
| jsapi-tests-gdb.py.in | ||
| Makefile.in | ||
| moz.build | ||
| README | ||
| selfTest.cpp | ||
| testAddPropertyPropcache.cpp | ||
| testArgumentsObject.cpp | ||
| testArrayBuffer.cpp | ||
| testArrayBufferView.cpp | ||
| testAssemblerBuffer.cpp | ||
| testBoundFunction.cpp | ||
| testBug604087.cpp | ||
| testCallArgs.cpp | ||
| testCallNonGenericMethodOnProxy.cpp | ||
| testChromeBuffer.cpp | ||
| testClassGetter.cpp | ||
| testCloneScript.cpp | ||
| testDateToLocaleString.cpp | ||
| testDebugger.cpp | ||
| testDeepFreeze.cpp | ||
| testDefineGetterSetterNonEnumerable.cpp | ||
| testDefineProperty.cpp | ||
| testDefinePropertyIgnoredAttributes.cpp | ||
| testDeflateStringToUTF8Buffer.cpp | ||
| testDifferentNewTargetInvokeConstructor.cpp | ||
| testEnclosingFunction.cpp | ||
| testErrorCopying.cpp | ||
| testException.cpp | ||
| testExternalArrayBuffer.cpp | ||
| testExternalStrings.cpp | ||
| testFindSCCs.cpp | ||
| testForceLexicalInitialization.cpp | ||
| testForOfIterator.cpp | ||
| testForwardSetProperty.cpp | ||
| testFreshGlobalEvalRedefinition.cpp | ||
| testFunctionBinding.cpp | ||
| testFunctionProperties.cpp | ||
| testGCAllocator.cpp | ||
| testGCCellPtr.cpp | ||
| testGCChunkPool.cpp | ||
| testGCExactRooting.cpp | ||
| testGCFinalizeCallback.cpp | ||
| testGCHeapPostBarriers.cpp | ||
| testGCHooks.cpp | ||
| testGCMarking.cpp | ||
| testGCOutOfMemory.cpp | ||
| testGCStoreBufferRemoval.cpp | ||
| testGCUniqueId.cpp | ||
| testGCWeakCache.cpp | ||
| testGCWeakRef.cpp | ||
| testGetPropertyDescriptor.cpp | ||
| testHashTable.cpp | ||
| testIndexToString.cpp | ||
| testIntern.cpp | ||
| testIntlAvailableLocales.cpp | ||
| testIntString.cpp | ||
| testIntTypesABI.cpp | ||
| testIsInsideNursery.cpp | ||
| testIteratorObject.cpp | ||
| testJitDCEinGVN.cpp | ||
| testJitFoldsTo.cpp | ||
| testJitGVN.cpp | ||
| testJitMacroAssembler.cpp | ||
| testJitMinimalFunc.h | ||
| testJitMoveEmitterCycles-mips32.cpp | ||
| testJitMoveEmitterCycles.cpp | ||
| testJitRangeAnalysis.cpp | ||
| testJitRegisterSet.cpp | ||
| testJitRValueAlloc.cpp | ||
| testJSEvaluateScript.cpp | ||
| testLookup.cpp | ||
| testLooselyEqual.cpp | ||
| testMappedArrayBuffer.cpp | ||
| testMutedErrors.cpp | ||
| testNewObject.cpp | ||
| testNewTargetInvokeConstructor.cpp | ||
| testNullRoot.cpp | ||
| testObjectEmulatingUndefined.cpp | ||
| testOOM.cpp | ||
| testParseJSON.cpp | ||
| testPersistentRooted.cpp | ||
| testPreserveJitCode.cpp | ||
| testPrintf.cpp | ||
| testPrivateGCThingValue.cpp | ||
| testProfileStrings.cpp | ||
| testPromise.cpp | ||
| testPropCache.cpp | ||
| testReadableStream.cpp | ||
| testRegExp.cpp | ||
| testResolveRecursion.cpp | ||
| tests.cpp | ||
| tests.h | ||
| testSameValue.cpp | ||
| testSavedStacks.cpp | ||
| testScriptInfo.cpp | ||
| testScriptObject.cpp | ||
| testSetProperty.cpp | ||
| testSetPropertyIgnoringNamedGetter.cpp | ||
| testSharedImmutableStringsCache.cpp | ||
| testSlowScript.cpp | ||
| testSourcePolicy.cpp | ||
| testStringBuffer.cpp | ||
| testStructuredClone.cpp | ||
| testSymbol.cpp | ||
| testThreadingConditionVariable.cpp | ||
| testThreadingExclusiveData.cpp | ||
| testThreadingMutex.cpp | ||
| testThreadingThread.cpp | ||
| testToIntWidth.cpp | ||
| testTypedArrays.cpp | ||
| testUbiNode.cpp | ||
| testUncaughtSymbol.cpp | ||
| testUTF8.cpp | ||
| testValueABI.cpp | ||
| testWasmLEB128.cpp | ||
| testWeakMap.cpp | ||
| testXDR.cpp | ||
| valueABI.c | ||
# 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.
To run the tests:
cd $OBJDIR/dist/bin
./jsapi-tests
To run the tests in a debugger:
cd $OBJDIR/dist/bin
gdb ./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 "tests.h"
BEGIN_TEST(testIntString_bug515273)
{
RootedValue v(cx);
EVAL("'42';", &v);
JSString *str = v.toString();
CHECK(JS_StringHasBeenInterned(cx, str));
CHECK(JS_FlatStringEqualsAscii(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, 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();