# HG changeset patch # User Jaroslav Tulach # Date 1355135192 -3600 # Node ID fbf8eb98a8efa1e7b788cd08803dc739fd4d0f05 # Parent c6f21b56a6cf27297423f6db3f93e3227142dc79 Proper behaviour of endsWith and associated test diff -r c6f21b56a6cf -r fbf8eb98a8ef emul/src/main/java/java/lang/String.java --- a/emul/src/main/java/java/lang/String.java Sun Dec 09 16:43:36 2012 +0100 +++ b/emul/src/main/java/java/lang/String.java Mon Dec 10 11:26:32 2012 +0100 @@ -1426,7 +1426,7 @@ */ @JavaScriptBody(args = { "self", "find", "from" }, body= "find = find.toString();\n" + - "return self.toString().substring(from, find.length) === find;\n" + "return self.toString().substring(from, from + find.length) === find;\n" ) public boolean startsWith(String prefix, int toffset) { char ta[] = toCharArray(); diff -r c6f21b56a6cf -r fbf8eb98a8ef javaquery/demo-calculator/src/main/java/org/apidesign/bck2brwsr/mavenhtml/App.java --- a/javaquery/demo-calculator/src/main/java/org/apidesign/bck2brwsr/mavenhtml/App.java Sun Dec 09 16:43:36 2012 +0100 +++ b/javaquery/demo-calculator/src/main/java/org/apidesign/bck2brwsr/mavenhtml/App.java Mon Dec 10 11:26:32 2012 +0100 @@ -70,6 +70,10 @@ private static void setValue(double v) { StringBuilder sb = new StringBuilder(); sb.append(v); + if (sb.toString().endsWith(".0")) { + final int l = sb.length(); + sb.delete(l - 2, l); + } Calculator.DISPLAY.setValue(sb.toString()); } diff -r c6f21b56a6cf -r fbf8eb98a8ef vm/src/test/java/org/apidesign/vm4brwsr/CompareVMs.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/CompareVMs.java Sun Dec 09 16:43:36 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/CompareVMs.java Mon Dec 10 11:26:32 2012 +0100 @@ -73,7 +73,7 @@ if (v1 instanceof Number) { v1 = ((Number)v1).doubleValue(); } - Assert.assertEquals(v1, v2, "Comparing results"); + Assert.assertEquals(v2, v1, "Comparing results"); } @Override @@ -130,7 +130,7 @@ try { compileTheCode(m.getDeclaringClass()); Object inst = code.invokeFunction(m.getDeclaringClass().getName().replace('.', '_'), false); - value = code.invokeMethod(inst, m.getName() + "__I"); + value = code.invokeMethod(inst, m.getName() + "__" + computeSignature(m)); } catch (Exception ex) { throw new AssertionError(StaticMethodTest.dumpJS(codeSeq)).initCause(ex); } @@ -142,5 +142,56 @@ public String getTestName() { return m.getName() + (js ? "[JavaScript]" : "[Java]"); } + + private static String computeSignature(Method m) { + StringBuilder sb = new StringBuilder(); + appendType(sb, m.getReturnType()); + for (Class c : m.getParameterTypes()) { + appendType(sb, c); + } + return sb.toString(); + } + + private static void appendType(StringBuilder sb, Class t) { + if (t == null) { + sb.append('V'); + return; + } + if (t.isPrimitive()) { + int ch = -1; + if (t == int.class) { + ch = 'I'; + } + if (t == short.class) { + ch = 'S'; + } + if (t == byte.class) { + ch = 'B'; + } + if (t == boolean.class) { + ch = 'Z'; + } + if (t == long.class) { + ch = 'J'; + } + if (t == float.class) { + ch = 'F'; + } + if (t == double.class) { + ch = 'D'; + } + assert ch != -1 : "Unknown primitive type " + t; + sb.append((char)ch); + return; + } + if (t.isArray()) { + sb.append("_3"); + appendType(sb, t.getComponentType()); + return; + } + sb.append('L'); + sb.append(t.getName().replace('.', '_')); + sb.append("_2"); + } } } diff -r c6f21b56a6cf -r fbf8eb98a8ef vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java Mon Dec 10 11:26:32 2012 +0100 @@ -0,0 +1,43 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.vm4brwsr.tck; + +import org.apidesign.vm4brwsr.Compare; +import org.apidesign.vm4brwsr.CompareVMs; +import org.testng.annotations.Factory; + +/** + * + * @author Jaroslav Tulach + */ +public class CompareStringsTest { + @Compare public String deleteLastTwoCharacters() { + StringBuilder sb = new StringBuilder(); + sb.append("453.0"); + if (sb.toString().endsWith(".0")) { + final int l = sb.length(); + sb.delete(l - 2, l); + } + return sb.toString().toString(); + } + + @Factory + public static Object[] create() { + return CompareVMs.create(CompareStringsTest.class); + } +}