On x86 compilers without fastcall, simulate it when invoking traces and un-simulate...
[wine-gecko.git] / js / tests / lc3 / StringMethods / string-001.js
blob6d99fd8f1dbffbef7c226a189e9180175106ef12
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4  *
5  * The contents of this file are subject to the Mozilla Public License Version
6  * 1.1 (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  * http://www.mozilla.org/MPL/
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the
13  * License.
14  *
15  * The Original Code is Mozilla Communicator client code, released
16  * March 31, 1998.
17  *
18  * The Initial Developer of the Original Code is
19  * Netscape Communications Corporation.
20  * Portions created by the Initial Developer are Copyright (C) 1998
21  * the Initial Developer. All Rights Reserved.
22  *
23  * Contributor(s):
24  *
25  * Alternatively, the contents of this file may be used under the terms of
26  * either the GNU General Public License Version 2 or later (the "GPL"), or
27  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28  * in which case the provisions of the GPL or the LGPL are applicable instead
29  * of those above. If you wish to allow use of your version of this file only
30  * under the terms of either the GPL or the LGPL, and not to allow others to
31  * use your version of this file under the terms of the MPL, indicate your
32  * decision by deleting the provisions above and replace them with the notice
33  * and other provisions required by the GPL or the LGPL. If you do not delete
34  * the provisions above, a recipient may use your version of this file under
35  * the terms of any one of the MPL, the GPL or the LGPL.
36  *
37  * ***** END LICENSE BLOCK ***** */
39 gTestfile = 'string-001.js';
41 /**
42  *  java.lang.String objects "inherit" JS string methods
43  *
44  *
45  */
46 var SECTION = "java.lang.Strings using JavaScript String methods";
47 var VERSION = "1_4";
48 var TITLE   = "LiveConnect 3.0 " + SECTION;
50 startTest();
52 var jm = getMethods( "java.lang.String" );
53 var methods = new Array();
55 for ( var i = 0; i < jm.length; i++ ) {
56   cm = jm[i].toString();
57   methods[methods.length] = [ getMethodName(cm), getArguments(cm) ];
60 var a = new Array();
62 // These are methods of String.prototype  that differ from existing
63 // methods of java.lang.String in argument number or type, and but
64 // according to scott should still be overriden by java.lang.String
65 // methods. valueOf
67 a[a.length] = new TestObject(
68   "var s"+a.length+" = new java.lang.String(\"hello\"); s"+a.length+".valueOf("+a.length+") +''",
69   "s"+a.length,
70   "valueOf",
71   1,
72   false,
73   "0.0" );
75 // These are methods of String.prototype that should be overriden
76 // by methods of java.lang.String:
77 // toString  charAt indexOf lastIndexOf substring substring(int, int)
78 // toLowerCase toUpperCase
80 a[a.length] = new TestObject(
81   "var s" +a.length+" = new java.lang.String(\"boo\"); s"+a.length+".toString() +''",
82   "s"+a.length,
83   "toString",
84   0,
85   false,
86   "boo" );
88 a[a.length] = new TestObject(
89   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".charAt(0)",
90   "s"+a.length,
91   "charAt",
92   1,
93   false,
94   "J".charCodeAt(0) );
96 a[a.length] = new TestObject(
97   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".indexOf(\"L\")",
98   "s"+a.length,
99   "indexOf",
100   1,
101   false,
102   11 );
105 a[a.length] = new TestObject(
106   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".lastIndexOf(\"t\")",
107   "s"+a.length,
108   "lastIndexOf",
109   1,
110   false,
111   21 );
113 a[a.length] = new TestObject(
114   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".substring(\"11\") +''",
115   "s"+a.length,
116   "substring",
117   1,
118   false,
119   "LiveConnect" );
121 a[a.length] = new TestObject(
122   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".substring(\"15\") +''",
123   "s"+a.length,
124   "substring",
125   1,
126   false,
127   "Connect" );
129 a[a.length] = new TestObject(
130   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".substring(4,10) +''",
131   "s"+a.length,
132   "substring",
133   2,
134   false,
135   "Script" );
137 a[a.length] = new TestObject(
138   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".toLowerCase() +''",
139   "s"+a.length,
140   "substring",
141   0,
142   false,
143   "javascript liveconnect" );
145 a[a.length] = new TestObject(
146   "var s" +a.length+" = new java.lang.String(\"JavaScript LiveConnect\"); s"+a.length+".toUpperCase() +''",
147   "s"+a.length,
148   "substring",
149   0,
150   false,
151   "JAVASCRIPT LIVECONNECT" );
153 // These are methods of String.prototype but are not methods of
154 // java.lang.String, so they should not be overriden.  The method
155 // of the instance should be the same as the method of String.prototype
156 // fromCharCode charCodeAt constructor split
158 /* No longer valid in JDK 1.4: java.lang.String now has a split method.
160 a[a.length] = new TestObject(
161 "var s" +a.length+" = new java.lang.String(\"0 1 2 3 4 5 6 7 8 9\"); s"+a.length+".split(\" \") +''",
162 "s"+a.length,
163 "split",
165 true,
166 "0,1,2,3,4,5,6,7,8,9" );
169 a[a.length] = new TestObject(
170   "var s" +a.length+" = new java.lang.String(\"0 1 2 3 4 5 6 7 8 9\"); s"+a.length+".constructor",
171   "s"+a.length,
172   "constructor",
173   0,
174   true,
175   String.prototype.constructor);
178 test();
180 // figure out what methods exist
181 // if there is no java method with the same name as a js method, should
182 // be able to invoke the js method without casting to a js string.  also
183 // the method should equal the same method of String.prototype.
184 // if there is a java method with the same name as a js method, invoking
185 // the method should call the java method
187 function TestObject( description, ob, method, argLength, override, expect ) {
188   this.description = description;
189   this.object = ob;
190   this.method = method;
191   this.override = override
192     this.argLength = argLength;
193   this.expect;
195   this.result = eval(description);
197   this.isJSMethod = eval( ob +"."+ method +" == String.prototype." + method );
199   new TestCase(
200     description,
201     expect,
202     this.result );
204   if ( hasMethod( method, argLength )  ) {
205     new TestCase(
206       ob +"." + method +" == String.prototype." + method,
207       override,
208       this.isJSMethod );
210   } else  {
211     // If the java class has no method with that name and number of
212     // arguments, the value of the method should be the value of
213     // String.prototype.methodName
215     new TestCase(
216       ob +"." + method +" == String.prototype." + method,
217       override,
218       this.isJSMethod );
219   }
222 function getMethods( javaString ) {
223   return java.lang.Class.forName( javaString ).getMethods();
225 function isStatic( m ) {
226   if ( m.lastIndexOf("static") > 0 ) {
227     // static method, return true
228     return true;
229   }
230   return false;
232 function getArguments( m ) {
233   var argIndex = m.lastIndexOf("(", m.length());
234   var argString = m.substr(argIndex+1, m.length() - argIndex -2);
235   return argString.split( "," );
237 function getMethodName( m ) {
238   var argIndex = m.lastIndexOf( "(", m.length());
239   var nameIndex = m.lastIndexOf( ".", argIndex);
240   return m.substr( nameIndex +1, argIndex - nameIndex -1 );
242 function hasMethod( m, noArgs ) {
243   for ( var i = 0; i < methods.length; i++ ) {
244     if ( (m == methods[i][0]) && (noArgs == methods[i][1].length)) {
245       return true;
246     }
247   }
248   return false;