123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464 |
- module("equiv");
- test("Primitive types and constants", function () {
- equal(QUnit.equiv(null, null), true, "null");
- equal(QUnit.equiv(null, {}), false, "null");
- equal(QUnit.equiv(null, undefined), false, "null");
- equal(QUnit.equiv(null, 0), false, "null");
- equal(QUnit.equiv(null, false), false, "null");
- equal(QUnit.equiv(null, ''), false, "null");
- equal(QUnit.equiv(null, []), false, "null");
- equal(QUnit.equiv(undefined, undefined), true, "undefined");
- equal(QUnit.equiv(undefined, null), false, "undefined");
- equal(QUnit.equiv(undefined, 0), false, "undefined");
- equal(QUnit.equiv(undefined, false), false, "undefined");
- equal(QUnit.equiv(undefined, {}), false, "undefined");
- equal(QUnit.equiv(undefined, []), false, "undefined");
- equal(QUnit.equiv(undefined, ""), false, "undefined");
- // Nan usually doest not equal to Nan using the '==' operator.
- // Only isNaN() is able to do it.
- equal(QUnit.equiv(0/0, 0/0), true, "NaN"); // NaN VS NaN
- equal(QUnit.equiv(1/0, 2/0), true, "Infinity"); // Infinity VS Infinity
- equal(QUnit.equiv(-1/0, 2/0), false, "-Infinity, Infinity"); // -Infinity VS Infinity
- equal(QUnit.equiv(-1/0, -2/0), true, "-Infinity, -Infinity"); // -Infinity VS -Infinity
- equal(QUnit.equiv(0/0, 1/0), false, "NaN, Infinity"); // Nan VS Infinity
- equal(QUnit.equiv(1/0, 0/0), false, "NaN, Infinity"); // Nan VS Infinity
- equal(QUnit.equiv(0/0, null), false, "NaN");
- equal(QUnit.equiv(0/0, undefined), false, "NaN");
- equal(QUnit.equiv(0/0, 0), false, "NaN");
- equal(QUnit.equiv(0/0, false), false, "NaN");
- equal(QUnit.equiv(0/0, function () {}), false, "NaN");
- equal(QUnit.equiv(1/0, null), false, "NaN, Infinity");
- equal(QUnit.equiv(1/0, undefined), false, "NaN, Infinity");
- equal(QUnit.equiv(1/0, 0), false, "NaN, Infinity");
- equal(QUnit.equiv(1/0, 1), false, "NaN, Infinity");
- equal(QUnit.equiv(1/0, false), false, "NaN, Infinity");
- equal(QUnit.equiv(1/0, true), false, "NaN, Infinity");
- equal(QUnit.equiv(1/0, function () {}), false, "NaN, Infinity");
- equal(QUnit.equiv(0, 0), true, "number");
- equal(QUnit.equiv(0, 1), false, "number");
- equal(QUnit.equiv(1, 0), false, "number");
- equal(QUnit.equiv(1, 1), true, "number");
- equal(QUnit.equiv(1.1, 1.1), true, "number");
- equal(QUnit.equiv(0.0000005, 0.0000005), true, "number");
- equal(QUnit.equiv(0, ''), false, "number");
- equal(QUnit.equiv(0, '0'), false, "number");
- equal(QUnit.equiv(1, '1'), false, "number");
- equal(QUnit.equiv(0, false), false, "number");
- equal(QUnit.equiv(1, true), false, "number");
- equal(QUnit.equiv(true, true), true, "boolean");
- equal(QUnit.equiv(true, false), false, "boolean");
- equal(QUnit.equiv(false, true), false, "boolean");
- equal(QUnit.equiv(false, 0), false, "boolean");
- equal(QUnit.equiv(false, null), false, "boolean");
- equal(QUnit.equiv(false, undefined), false, "boolean");
- equal(QUnit.equiv(true, 1), false, "boolean");
- equal(QUnit.equiv(true, null), false, "boolean");
- equal(QUnit.equiv(true, undefined), false, "boolean");
- equal(QUnit.equiv('', ''), true, "string");
- equal(QUnit.equiv('a', 'a'), true, "string");
- equal(QUnit.equiv("foobar", "foobar"), true, "string");
- equal(QUnit.equiv("foobar", "foo"), false, "string");
- equal(QUnit.equiv('', 0), false, "string");
- equal(QUnit.equiv('', false), false, "string");
- equal(QUnit.equiv('', null), false, "string");
- equal(QUnit.equiv('', undefined), false, "string");
- // Rename for lint validation.
- // We know this is bad, we are asserting whether we can coop with bad code like this.
- var SafeNumber = Number, SafeString = String, SafeBoolean = Boolean, SafeObject = Object;
- // primitives vs. objects
- equal(QUnit.equiv(0, new SafeNumber()), true, "primitives vs. objects");
- equal(QUnit.equiv(new SafeNumber(), 0), true, "primitives vs. objects");
- equal(QUnit.equiv(1, new SafeNumber(1)), true, "primitives vs. objects");
- equal(QUnit.equiv(new SafeNumber(1), 1), true, "primitives vs. objects");
- equal(QUnit.equiv(new SafeNumber(0), 1), false, "primitives vs. objects");
- equal(QUnit.equiv(0, new SafeNumber(1)), false, "primitives vs. objects");
- equal(QUnit.equiv(new SafeString(), ""), true, "primitives vs. objects");
- equal(QUnit.equiv("", new SafeString()), true, "primitives vs. objects");
- equal(QUnit.equiv(new SafeString("My String"), "My String"), true, "primitives vs. objects");
- equal(QUnit.equiv("My String", new SafeString("My String")), true, "primitives vs. objects");
- equal(QUnit.equiv("Bad String", new SafeString("My String")), false, "primitives vs. objects");
- equal(QUnit.equiv(new SafeString("Bad String"), "My String"), false, "primitives vs. objects");
- equal(QUnit.equiv(false, new SafeBoolean()), true, "primitives vs. objects");
- equal(QUnit.equiv(new SafeBoolean(), false), true, "primitives vs. objects");
- equal(QUnit.equiv(true, new SafeBoolean(true)), true, "primitives vs. objects");
- equal(QUnit.equiv(new SafeBoolean(true), true), true, "primitives vs. objects");
- equal(QUnit.equiv(true, new SafeBoolean(1)), true, "primitives vs. objects");
- equal(QUnit.equiv(false, new SafeBoolean(false)), true, "primitives vs. objects");
- equal(QUnit.equiv(new SafeBoolean(false), false), true, "primitives vs. objects");
- equal(QUnit.equiv(false, new SafeBoolean(0)), true, "primitives vs. objects");
- equal(QUnit.equiv(true, new SafeBoolean(false)), false, "primitives vs. objects");
- equal(QUnit.equiv(new SafeBoolean(false), true), false, "primitives vs. objects");
- equal(QUnit.equiv(new SafeObject(), {}), true, "object literal vs. instantiation");
- equal(QUnit.equiv({}, new SafeObject()), true, "object literal vs. instantiation");
- equal(QUnit.equiv(new SafeObject(), {a:1}), false, "object literal vs. instantiation");
- equal(QUnit.equiv({a:1}, new SafeObject()), false, "object literal vs. instantiation");
- equal(QUnit.equiv({a:undefined}, new SafeObject()), false, "object literal vs. instantiation");
- equal(QUnit.equiv(new SafeObject(), {a:undefined}), false, "object literal vs. instantiation");
- });
- test("Objects Basics.", function() {
- equal(QUnit.equiv({}, {}), true);
- equal(QUnit.equiv({}, null), false);
- equal(QUnit.equiv({}, undefined), false);
- equal(QUnit.equiv({}, 0), false);
- equal(QUnit.equiv({}, false), false);
- // This test is a hard one, it is very important
- // REASONS:
- // 1) They are of the same type "object"
- // 2) [] instanceof Object is true
- // 3) Their properties are the same (doesn't exists)
- equal(QUnit.equiv({}, []), false);
- equal(QUnit.equiv({a:1}, {a:1}), true);
- equal(QUnit.equiv({a:1}, {a:"1"}), false);
- equal(QUnit.equiv({a:[]}, {a:[]}), true);
- equal(QUnit.equiv({a:{}}, {a:null}), false);
- equal(QUnit.equiv({a:1}, {}), false);
- equal(QUnit.equiv({}, {a:1}), false);
- // Hard ones
- equal(QUnit.equiv({a:undefined}, {}), false);
- equal(QUnit.equiv({}, {a:undefined}), false);
- equal(QUnit.equiv(
- {
- a: [{ bar: undefined }]
- },
- {
- a: [{ bat: undefined }]
- }
- ), false);
- // Objects with no prototype, created via Object.create(null), are used e.g. as dictionaries.
- // Being able to test equivalence against object literals is quite useful.
- if (typeof Object.create === 'function') {
- equal(QUnit.equiv(Object.create(null), {}), true, "empty object without prototype VS empty object");
- var nonEmptyWithNoProto = Object.create(null);
- nonEmptyWithNoProto.foo = "bar";
- equal(QUnit.equiv(nonEmptyWithNoProto, { foo: "bar" }), true, "object without prototype VS object");
- }
- });
- test("Arrays Basics.", function() {
- equal(QUnit.equiv([], []), true);
- // May be a hard one, can invoke a crash at execution.
- // because their types are both "object" but null isn't
- // like a true object, it doesn't have any property at all.
- equal(QUnit.equiv([], null), false);
- equal(QUnit.equiv([], undefined), false);
- equal(QUnit.equiv([], false), false);
- equal(QUnit.equiv([], 0), false);
- equal(QUnit.equiv([], ""), false);
- // May be a hard one, but less hard
- // than {} with [] (note the order)
- equal(QUnit.equiv([], {}), false);
- equal(QUnit.equiv([null],[]), false);
- equal(QUnit.equiv([undefined],[]), false);
- equal(QUnit.equiv([],[null]), false);
- equal(QUnit.equiv([],[undefined]), false);
- equal(QUnit.equiv([null],[undefined]), false);
- equal(QUnit.equiv([[]],[[]]), true);
- equal(QUnit.equiv([[],[],[]],[[],[],[]]), true);
- equal(QUnit.equiv(
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]),
- true);
- equal(QUnit.equiv(
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // shorter
- false);
- equal(QUnit.equiv(
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // deepest element not an array
- false);
- // same multidimensional
- equal(QUnit.equiv(
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]],
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]]),
- true, "Multidimensional");
- // different multidimensional
- equal(QUnit.equiv(
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]],
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- '1',2,3,4,[ // string instead of number
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]]),
- false, "Multidimensional");
- // different multidimensional
- equal(QUnit.equiv(
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]],
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,[ // missing an element (4)
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]]),
- false, "Multidimensional");
- });
- test("Functions.", function() {
- var f0 = function () {};
- var f1 = function () {};
- // f2 and f3 have the same code, formatted differently
- var f2 = function () {var i = 0;};
- var f3 = function () {
- /*jshint asi:true */
- var i = 0 // this comment and no semicoma as difference
- };
- equal(QUnit.equiv(function() {}, function() {}), false, "Anonymous functions"); // exact source code
- equal(QUnit.equiv(function() {}, function() {return true;}), false, "Anonymous functions");
- equal(QUnit.equiv(f0, f0), true, "Function references"); // same references
- equal(QUnit.equiv(f0, f1), false, "Function references"); // exact source code, different references
- equal(QUnit.equiv(f2, f3), false, "Function references"); // equivalent source code, different references
- equal(QUnit.equiv(f1, f2), false, "Function references"); // different source code, different references
- equal(QUnit.equiv(function() {}, true), false);
- equal(QUnit.equiv(function() {}, undefined), false);
- equal(QUnit.equiv(function() {}, null), false);
- equal(QUnit.equiv(function() {}, {}), false);
- });
- test("Date instances.", function() {
- // Date, we don't need to test Date.parse() because it returns a number.
- // Only test the Date instances by setting them a fix date.
- // The date use is midnight January 1, 1970
- var d1 = new Date();
- d1.setTime(0); // fix the date
- var d2 = new Date();
- d2.setTime(0); // fix the date
- var d3 = new Date(); // The very now
- // Anyway their types differs, just in case the code fails in the order in which it deals with date
- equal(QUnit.equiv(d1, 0), false); // d1.valueOf() returns 0, but d1 and 0 are different
- // test same values date and different instances equality
- equal(QUnit.equiv(d1, d2), true);
- // test different date and different instances difference
- equal(QUnit.equiv(d1, d3), false);
- });
- test("RegExp.", function() {
- // Must test cases that imply those traps:
- // var a = /./;
- // a instanceof Object; // Oops
- // a instanceof RegExp; // Oops
- // typeof a === "function"; // Oops, false in IE and Opera, true in FF and Safari ("object")
- // Tests same regex with same modifiers in different order
- var r = /foo/;
- var r5 = /foo/gim;
- var r6 = /foo/gmi;
- var r7 = /foo/igm;
- var r8 = /foo/img;
- var r9 = /foo/mig;
- var r10 = /foo/mgi;
- var ri1 = /foo/i;
- var ri2 = /foo/i;
- var rm1 = /foo/m;
- var rm2 = /foo/m;
- var rg1 = /foo/g;
- var rg2 = /foo/g;
- equal(QUnit.equiv(r5, r6), true, "Modifier order");
- equal(QUnit.equiv(r5, r7), true, "Modifier order");
- equal(QUnit.equiv(r5, r8), true, "Modifier order");
- equal(QUnit.equiv(r5, r9), true, "Modifier order");
- equal(QUnit.equiv(r5, r10), true, "Modifier order");
- equal(QUnit.equiv(r, r5), false, "Modifier");
- equal(QUnit.equiv(ri1, ri2), true, "Modifier");
- equal(QUnit.equiv(r, ri1), false, "Modifier");
- equal(QUnit.equiv(ri1, rm1), false, "Modifier");
- equal(QUnit.equiv(r, rm1), false, "Modifier");
- equal(QUnit.equiv(rm1, ri1), false, "Modifier");
- equal(QUnit.equiv(rm1, rm2), true, "Modifier");
- equal(QUnit.equiv(rg1, rm1), false, "Modifier");
- equal(QUnit.equiv(rm1, rg1), false, "Modifier");
- equal(QUnit.equiv(rg1, rg2), true, "Modifier");
- // Different regex, same modifiers
- var r11 = /[a-z]/gi;
- var r13 = /[0-9]/gi; // oops! different
- equal(QUnit.equiv(r11, r13), false, "Regex pattern");
- var r14 = /0/ig;
- var r15 = /"0"/ig; // oops! different
- equal(QUnit.equiv(r14, r15), false, "Regex pattern");
- var r1 = /[\n\r\u2028\u2029]/g;
- var r2 = /[\n\r\u2028\u2029]/g;
- var r3 = /[\n\r\u2028\u2028]/g; // differs from r1
- var r4 = /[\n\r\u2028\u2029]/; // differs from r1
- equal(QUnit.equiv(r1, r2), true, "Regex pattern");
- equal(QUnit.equiv(r1, r3), false, "Regex pattern");
- equal(QUnit.equiv(r1, r4), false, "Regex pattern");
- // More complex regex
- var regex1 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$";
- var regex2 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$";
- // regex 3 is different: '.' not escaped
- var regex3 = "^[-_.a-z0-9]+@([-_a-z0-9]+.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$";
- var r21 = new RegExp(regex1);
- var r22 = new RegExp(regex2);
- var r23 = new RegExp(regex3); // diff from r21, not same pattern
- var r23a = new RegExp(regex3, "gi"); // diff from r23, not same modifier
- var r24a = new RegExp(regex3, "ig"); // same as r23a
- equal(QUnit.equiv(r21, r22), true, "Complex Regex");
- equal(QUnit.equiv(r21, r23), false, "Complex Regex");
- equal(QUnit.equiv(r23, r23a), false, "Complex Regex");
- equal(QUnit.equiv(r23a, r24a), true, "Complex Regex");
- // typeof r1 is "function" in some browsers and "object" in others so we must cover this test
- var re = / /;
- equal(QUnit.equiv(re, function () {}), false, "Regex internal");
- equal(QUnit.equiv(re, {}), false, "Regex internal");
- });
- test("Complex Objects.", function() {
- function fn1() {
- return "fn1";
- }
- function fn2() {
- return "fn2";
- }
- // Try to invert the order of some properties to make sure it is covered.
- // It can failed when properties are compared between unsorted arrays.
- equal(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- q: [],
- p: 1/0,
- o: 99
- },
- l: undefined,
- m: null
- }
- },
- d: 0,
- i: true,
- h: "false"
- }
- },
- e: undefined,
- g: "",
- h: "h",
- f: {},
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- b: false,
- a: 3.14159,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- t: undefined,
- u: 0,
- s: [1,2,3],
- v: {
- w: {
- x: {
- z: null,
- y: "Yahoo!"
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- i: true,
- h: "false"
- }
- },
- e: undefined,
- g: "",
- f: {},
- h: "h",
- i: []
- }
- ), true);
- equal(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- //r: "r", // different: missing a property
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- }
- ), false);
- equal(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- //t: undefined, // different: missing a property with an undefined value
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- }
- ), false);
- equal(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: {} // different was []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- }
- ), false);
- var same1 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωÏίζουμε ας των, μηχανής επιδιόÏθωσης επιδιοÏθώσεις ÏŽÏ‚ μια. Κλπ ας"
- ],
- unicode: "è€ æ±‰è¯ä¸å˜åœ¨ 港澳和海外的åŽäººåœˆä¸ 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
- var same2 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωÏίζουμε ας των, μηχανής επιδιόÏθωσης επιδιοÏθώσεις ÏŽÏ‚ μια. Κλπ ας"
- ],
- unicode: "è€ æ±‰è¯ä¸å˜åœ¨ 港澳和海外的åŽäººåœˆä¸ 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
- var diff1 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3,4]], // different: 4 was add to the array
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωÏίζουμε ας των, μηχανής επιδιόÏθωσης επιδιοÏθώσεις ÏŽÏ‚ μια. Κλπ ας"
- ],
- unicode: "è€ æ±‰è¯ä¸å˜åœ¨ 港澳和海外的åŽäººåœˆä¸ 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
- var diff2 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- newprop: undefined, // different: newprop was added
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωÏίζουμε ας των, μηχανής επιδιόÏθωσης επιδιοÏθώσεις ÏŽÏ‚ μια. Κλπ ας"
- ],
- unicode: "è€ æ±‰è¯ä¸å˜åœ¨ 港澳和海外的åŽäººåœˆä¸ 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
- var diff3 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωÏίζουμε ας των, μηχανής επιδιόÏθωσης επιδιοÏθώσεις ÏŽÏ‚ μια. Κλπ α" // different: missing last char
- ],
- unicode: "è€ æ±‰è¯ä¸å˜åœ¨ 港澳和海外的åŽäººåœˆä¸ 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
- var diff4 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,undefined,{}, [], [1,2,3]], // different: undefined instead of null
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωÏίζουμε ας των, μηχανής επιδιόÏθωσης επιδιοÏθώσεις ÏŽÏ‚ μια. Κλπ ας"
- ],
- unicode: "è€ æ±‰è¯ä¸å˜åœ¨ 港澳和海外的åŽäººåœˆä¸ 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
- var diff5 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bat: undefined // different: property name not "bar"
- }, 3, "Hey!", "Κάνε πάντα γνωÏίζουμε ας των, μηχανής επιδιόÏθωσης επιδιοÏθώσεις ÏŽÏ‚ μια. Κλπ ας"
- ],
- unicode: "è€ æ±‰è¯ä¸å˜åœ¨ 港澳和海外的åŽäººåœˆä¸ 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
- equal(QUnit.equiv(same1, same2), true);
- equal(QUnit.equiv(same2, same1), true);
- equal(QUnit.equiv(same2, diff1), false);
- equal(QUnit.equiv(diff1, same2), false);
- equal(QUnit.equiv(same1, diff1), false);
- equal(QUnit.equiv(same1, diff2), false);
- equal(QUnit.equiv(same1, diff3), false);
- equal(QUnit.equiv(same1, diff3), false);
- equal(QUnit.equiv(same1, diff4), false);
- equal(QUnit.equiv(same1, diff5), false);
- equal(QUnit.equiv(diff5, diff1), false);
- });
- test("Complex Arrays.", function() {
- function fn() {
- }
- equal(QUnit.equiv(
- [1, 2, 3, true, {}, null, [
- {
- a: ["", '1', 0]
- },
- 5, 6, 7
- ], "foo"],
- [1, 2, 3, true, {}, null, [
- {
- a: ["", '1', 0]
- },
- 5, 6, 7
- ], "foo"]),
- true);
- equal(QUnit.equiv(
- [1, 2, 3, true, {}, null, [
- {
- a: ["", '1', 0]
- },
- 5, 6, 7
- ], "foo"],
- [1, 2, 3, true, {}, null, [
- {
- b: ["", '1', 0] // not same property name
- },
- 5, 6, 7
- ], "foo"]),
- false);
- var a = [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]];
- equal(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), true);
- equal(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[2]]]], "3"], {}, 1/0 // different: [[[[[2]]]]] instead of [[[[[3]]]]]
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
- equal(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: -1/0, // different, -Infinity instead of Infinity
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
- equal(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", { // different: null is missing
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
- equal(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn
- // different: missing property f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
- });
- test("Prototypal inheritance", function() {
- function Gizmo(id) {
- this.id = id;
- }
- function Hoozit(id) {
- this.id = id;
- }
- Hoozit.prototype = new Gizmo();
- var gizmo = new Gizmo("ok");
- var hoozit = new Hoozit("ok");
- // Try this test many times after test on instances that hold function
- // to make sure that our code does not mess with last object constructor memoization.
- equal(QUnit.equiv(function () {}, function () {}), false);
- // Hoozit inherit from Gizmo
- // hoozit instanceof Hoozit; // true
- // hoozit instanceof Gizmo; // true
- equal(QUnit.equiv(hoozit, gizmo), true);
- Gizmo.prototype.bar = true; // not a function just in case we skip them
- // Hoozit inherit from Gizmo
- // They are equivalent
- equal(QUnit.equiv(hoozit, gizmo), true);
- // Make sure this is still true !important
- // The reason for this is that I forgot to reset the last
- // caller to where it were called from.
- equal(QUnit.equiv(function () {}, function () {}), false);
- // Make sure this is still true !important
- equal(QUnit.equiv(hoozit, gizmo), true);
- Hoozit.prototype.foo = true; // not a function just in case we skip them
- // Gizmo does not inherit from Hoozit
- // gizmo instanceof Gizmo; // true
- // gizmo instanceof Hoozit; // false
- // They are not equivalent
- equal(QUnit.equiv(hoozit, gizmo), false);
- // Make sure this is still true !important
- equal(QUnit.equiv(function () {}, function () {}), false);
- });
- test("Instances", function() {
- function A() {}
- var a1 = new A();
- var a2 = new A();
- function B() {
- this.fn = function () {};
- }
- var b1 = new B();
- var b2 = new B();
- equal(QUnit.equiv(a1, a2), true, "Same property, same constructor");
- // b1.fn and b2.fn are functions but they are different references
- // But we decided to skip function for instances.
- equal(QUnit.equiv(b1, b2), true, "Same property, same constructor");
- equal(QUnit.equiv(a1, b1), false, "Same properties but different constructor"); // failed
- function Car(year) {
- var privateVar = 0;
- this.year = year;
- this.isOld = function() {
- return year > 10;
- };
- }
- function Human(year) {
- var privateVar = 1;
- this.year = year;
- this.isOld = function() {
- return year > 80;
- };
- }
- var car = new Car(30);
- var carSame = new Car(30);
- var carDiff = new Car(10);
- var human = new Human(30);
- var diff = {
- year: 30
- };
- var same = {
- year: 30,
- isOld: function () {}
- };
- equal(QUnit.equiv(car, car), true);
- equal(QUnit.equiv(car, carDiff), false);
- equal(QUnit.equiv(car, carSame), true);
- equal(QUnit.equiv(car, human), false);
- });
- test("Complex Instances Nesting (with function value in literals and/or in nested instances)", function() {
- function A(fn) {
- this.a = {};
- this.fn = fn;
- this.b = {a: []};
- this.o = {};
- this.fn1 = fn;
- }
- function B(fn) {
- this.fn = fn;
- this.fn1 = function () {};
- this.a = new A(function () {});
- }
- function fnOutside() {
- }
- function C(fn) {
- function fnInside() {
- }
- this.x = 10;
- this.fn = fn;
- this.fn1 = function () {};
- this.fn2 = fnInside;
- this.fn3 = {
- a: true,
- b: fnOutside // ok make reference to a function in all instances scope
- };
- this.o1 = {};
- // This function will be ignored.
- // Even if it is not visible for all instances (e.g. locked in a closures),
- // it is from a property that makes part of an instance (e.g. from the C constructor)
- this.b1 = new B(function () {});
- this.b2 = new B({
- x: {
- b2: new B(function() {})
- }
- });
- }
- function D(fn) {
- function fnInside() {
- }
- this.x = 10;
- this.fn = fn;
- this.fn1 = function () {};
- this.fn2 = fnInside;
- this.fn3 = {
- a: true,
- b: fnOutside, // ok make reference to a function in all instances scope
- // This function won't be ingored.
- // It isn't visible for all C insances
- // and it is not in a property of an instance. (in an Object instances e.g. the object literal)
- c: fnInside
- };
- this.o1 = {};
- // This function will be ignored.
- // Even if it is not visible for all instances (e.g. locked in a closures),
- // it is from a property that makes part of an instance (e.g. from the C constructor)
- this.b1 = new B(function () {});
- this.b2 = new B({
- x: {
- b2: new B(function() {})
- }
- });
- }
- function E(fn) {
- function fnInside() {
- }
- this.x = 10;
- this.fn = fn;
- this.fn1 = function () {};
- this.fn2 = fnInside;
- this.fn3 = {
- a: true,
- b: fnOutside // ok make reference to a function in all instances scope
- };
- this.o1 = {};
- // This function will be ignored.
- // Even if it is not visible for all instances (e.g. locked in a closures),
- // it is from a property that makes part of an instance (e.g. from the C constructor)
- this.b1 = new B(function () {});
- this.b2 = new B({
- x: {
- b1: new B({a: function() {}}),
- b2: new B(function() {})
- }
- });
- }
- var a1 = new A(function () {});
- var a2 = new A(function () {});
- equal(QUnit.equiv(a1, a2), true);
- equal(QUnit.equiv(a1, a2), true); // different instances
- var b1 = new B(function () {});
- var b2 = new B(function () {});
- equal(QUnit.equiv(b1, b2), true);
- var c1 = new C(function () {});
- var c2 = new C(function () {});
- equal(QUnit.equiv(c1, c2), true);
- var d1 = new D(function () {});
- var d2 = new D(function () {});
- equal(QUnit.equiv(d1, d2), false);
- var e1 = new E(function () {});
- var e2 = new E(function () {});
- equal(QUnit.equiv(e1, e2), false);
- });
- test('object with references to self wont loop', function() {
- var circularA = {
- abc:null
- }, circularB = {
- abc:null
- };
- circularA.abc = circularA;
- circularB.abc = circularB;
- equal(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)");
- circularA.def = 1;
- circularB.def = 1;
- equal(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)");
- circularA.def = 1;
- circularB.def = 0;
- equal(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object (unambigous test)");
- });
- test('array with references to self wont loop', function() {
- var circularA = [],
- circularB = [];
- circularA.push(circularA);
- circularB.push(circularB);
- equal(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)");
- circularA.push( 'abc' );
- circularB.push( 'abc' );
- equal(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)");
- circularA.push( 'hello' );
- circularB.push( 'goodbye' );
- equal(QUnit.equiv(circularA, circularB), false, "Should not repeat test on array (unambigous test)");
- });
- test('mixed object/array with references to self wont loop', function() {
- var circularA = [{abc:null}],
- circularB = [{abc:null}];
- circularA[0].abc = circularA;
- circularB[0].abc = circularB;
- circularA.push(circularA);
- circularB.push(circularB);
- equal(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)");
- circularA[0].def = 1;
- circularB[0].def = 1;
- equal(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)");
- circularA[0].def = 1;
- circularB[0].def = 0;
- equal(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object/array (unambigous test)");
- });
- test('compare self-referent to tree', function () {
- var temp,
- circularA = [0],
- treeA = [0, null],
- circularO = {},
- treeO = {
- o: null
- };
- circularA[1] = circularA;
- circularO.o = circularO;
- equal(QUnit.equiv(circularA, treeA), false, "Array: Should not consider circular equal to tree");
- equal(QUnit.equiv(circularO, treeO), false, "Object: Should not consider circular equal to tree");
- temp = [ 0, circularA ];
- equal(QUnit.equiv(circularA, temp), true, "Array: Reference is circular for one, but equal on other");
- equal(QUnit.equiv(temp, circularA), true, "Array: Reference is circular for one, but equal on other");
- temp = {
- o: circularO
- };
- equal(QUnit.equiv(circularO, temp), true, "Object: Reference is circular for one, but equal on other");
- equal(QUnit.equiv(temp, circularO), true, "Object: Reference is circular for one, but equal on other");
- });
- test("Test that must be done at the end because they extend some primitive's prototype", function() {
- // Try that a function looks like our regular expression.
- // This tests if we check that a and b are really both instance of RegExp
- Function.prototype.global = true;
- Function.prototype.multiline = true;
- Function.prototype.ignoreCase = false;
- Function.prototype.source = "my regex";
- var re = /my regex/gm;
- equal(QUnit.equiv(re, function () {}), false, "A function that looks that a regex isn't a regex");
- // This test will ensures it works in both ways, and ALSO especially that we can make differences
- // between RegExp and Function constructor because typeof on a RegExpt instance is "function"
- equal(QUnit.equiv(function () {}, re), false, "Same conversely, but ensures that function and regexp are distinct because their constructor are different");
- });
|