diff --git a/js/src/xpconnect/tests/Makefile.in b/js/src/xpconnect/tests/Makefile.in index 1d380a838663..aa0f4ad7c868 100644 --- a/js/src/xpconnect/tests/Makefile.in +++ b/js/src/xpconnect/tests/Makefile.in @@ -38,7 +38,10 @@ LIBS = \ $(NSPR_LIBS) \ $(NULL) -TEST_FILES = $(srcdir)/testxpc.js $(srcdir)/xpctest_echo.js +TEST_FILES = $(srcdir)/testxpc.js \ + $(srcdir)/xpctest_echo.js \ + $(srcdir)/xpctest_primitives.js + include $(topsrcdir)/config/rules.mk diff --git a/js/src/xpconnect/tests/makefile.win b/js/src/xpconnect/tests/makefile.win index 0bc0927d708a..5857b70af3f4 100644 --- a/js/src/xpconnect/tests/makefile.win +++ b/js/src/xpconnect/tests/makefile.win @@ -24,7 +24,11 @@ DIRS = components MAKE_OBJ_TYPE = EXE PROG1 = .\$(OBJDIR)\TestXPC.exe PROGRAMS = $(PROG1) -TESTCASES = testxpc.js simpletest.js xpctest_echo.js +TESTCASES = \ + testxpc.js \ + simpletest.js \ + xpctest_echo.js \ + xpctest_primitives.js LCFLAGS=-DUSE_NSREG -DWIN32_LEAN_AND_MEAN -DJS_THREADSAFE -DJSFILE diff --git a/js/src/xpconnect/tests/xpctest_primitives.js b/js/src/xpconnect/tests/xpctest_primitives.js new file mode 100644 index 000000000000..7b5794175f01 --- /dev/null +++ b/js/src/xpconnect/tests/xpctest_primitives.js @@ -0,0 +1,140 @@ +/* +* This is a test for the various nsISupports* 'Primitives' wrappers declared +* in nsISupportsPrimitives.idl. It is a data driven tests - more values can +* be added to the table. It creates instances of the 'wrapper' objects, sets +* a values and then does a 'Get' of the values and compares that to the +* original. It also exercises the 'toString' methods of the wrappers. +* +* The table has plugable compare functions to allows for 'equals' methods of +* comparision and to allow for 'close enough' comparison of floats and doubles +*/ + + +// prefix used by all these progids +progid_prefix = "component://netscape/"; + +// an iid to use to test nsISupportsID +var iface_test = Components.interfaces.nsISupports; +// the canonical number form for that iid (e.g. {xxx-xxx...}) +var i_str = iface_test.number + +// just a flag used to mean 'use the initial value to toString comparisons' +var same = Object; + +// the table of data... + +// columns are: +// 1) progid suffix +// 2) interface name +// 3) value +// 4) string to use to compare for toString ('same' mans use original value) +// 5) function to use for comparing values (null means use default compare) +// 6) function to use for comparing strings (null means use default compare) +var data = [ + ["supports-id" ,"nsISupportsID" ,iface_test,i_str ,eqfn , null], + ["supports-string" ,"nsISupportsString" ,"foo" ,same ,null , null], + ["supports-wstring" ,"nsISupportsWString" ,"bar" ,same ,null , null], + ["supports-PRBool" ,"nsISupportsPRBool" ,true ,same ,null , null], + ["supports-PRBool" ,"nsISupportsPRBool" ,false ,same ,null , null], + ["supports-PRUint8" ,"nsISupportsPRUint8" ,7 ,same ,null , null], + ["supports-PRUint16","nsISupportsPRUint16",12345 ,same ,null , null], + ["supports-PRUint32","nsISupportsPRUint32",123456 ,same ,null , null], + ["supports-PRUint64","nsISupportsPRUint64",1234567 ,same ,null , null], + ["supports-PRTime" ,"nsISupportsPRTime" ,12345678 ,same ,null , null], + ["supports-char" ,"nsISupportsChar" ,'z' ,same ,null , null], + ["supports-PRInt16" ,"nsISupportsPRInt16" ,-123 ,same ,null , null], + ["supports-PRInt32" ,"nsISupportsPRInt32" ,-3456 ,same ,null , null], + ["supports-PRInt64" ,"nsISupportsPRInt64" ,-1234566 ,same ,null , null], + ["supports-float" ,"nsISupportsFloat" , 12.0001 ,same ,fcmp , fcmp], + ["supports-double" ,"nsISupportsDouble" , 1.0029202,same ,fcmp , fcmp], +]; + +function println(s) +{ + if(typeof(this.document) == "undefined") + print(s); + else + dump(s+"\n"); +} + +// use this to see if floats are fairly close +function fcmp(v1, v2) +{ + var f1 = parseFloat(v1); + var f2 = parseFloat(v2); + var retval = ((f1 - f2) < 0.001) || ((f2 - f1) < 0.001); +// if(retval) println(v1+" is close enough to "+v2); + return retval; +} + +function eqfn(v1, v2) +{ + return v1.equals(v2); +} + +function regular_compare(v1, v2) +{ + return v1 == v2; +} + +function test(progid, iid, d, string_val, val_compare_fn, str_compare_fn) +{ + var test1_result; + var test2_result; + var full_progid = progid_prefix+progid; +// println("checking... "+progid+" "+iid+ " with "+d); + var clazz = Components.classes[full_progid]; + if(!clazz) { + println(progid+ " is not a valid progid"); + return false; + } + var v = clazz.createInstance(Components.interfaces[iid]) + v.data = d; + + if(!val_compare_fn) + val_compare_fn = regular_compare; + + if(!str_compare_fn) + str_compare_fn = regular_compare; + + test1_result = val_compare_fn(d,v.data); + + if(string_val) { + if(string_val == same) + test2_result = str_compare_fn(""+v, ""+d); + else + test2_result = str_compare_fn(""+v, string_val); + } + else + test2_result = true; + + if(!test1_result) + println("failed for... "+progid+" with "+d+" returned "+v.data); + + if(!test2_result) + println("failed toString for... "+progid+" with "+d+" returned "+""+v); + + + return test1_result && test2_result; +} + +var failureCount = 0; +var exception = null; + +try { + println("\n\n starting test... \n"); + for(i = 0; i < data.length; i++) { + var r = data[i]; + if(!test(r[0], r[1], r[2], r[3], r[4], r[5])) { + failureCount++ ; + } + } +} catch(e) { + exception = e; + failureCount++ ; +} + + +if(exception) + println("caught exception... "+exception); +println("\n"+(failureCount == 0 ? "all tests PASSED" : ""+failureCount+" errors"));