/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.devtools.j2objc.translate; import com.google.devtools.j2objc.GenerationTest; import java.io.IOException; /** * Tests for {@link StaticVarRewriter}. * * @author Keith Stanger */ public class StaticVarRewriterTest extends GenerationTest { public void testRewriteChildOfQualifiedName() throws IOException { String translation = translateSourceFile( "class Test { static Test test = new Test(); Object obj = new Object();" + "static class Other { void test() { test.obj.toString(); test.obj.toString(); } } }", "Test", "Test.m"); assertTranslatedLines(translation, "[nil_chk(((Test *) nil_chk(JreLoadStatic(Test, test)))->obj_) description];", "[nil_chk(((Test *) nil_chk(JreLoadStatic(Test, test)))->obj_) description];"); } public void testAssinmentToNewObject() throws IOException { addSourceFile("class A { static Object o; }", "A.java"); String translation = translateSourceFile( "class Test { void test() { A.o = new Object(); } }", "Test", "Test.m"); assertTranslation(translation, "JreStrongAssignAndConsume(JreLoadStaticRef(A, o), new_NSObject_init());"); } public void testFieldAccessRewriting() throws IOException { String translation = translateSourceFile( "class Test { static int i = 5; static Test getTest() { return null; } " + " static void test() { Test t = new Test(); int a = t.i; int b = getTest().i; " + " int c = getTest().i++; int d = getTest().i = 6; } }", "Test", "Test.m"); assertTranslatedLines(translation, "jint a = Test_i;", "jint b = (Test_getTest(), Test_i);", "jint c = (*(Test_getTest(), &Test_i))++;", "jint d = *(Test_getTest(), &Test_i) = 6;"); } public void testFieldAccessRewritingWithStaticLoads() throws IOException { String translation = translateSourceFile( "class Test { static int i = 5; static class Inner { " + " static Test getTest() { return null; } " + " static void test() { Test t = new Test(); int a = t.i; int b = getTest().i; " + " int c = getTest().i++; int d = getTest().i = 6; } } }", "Test", "Test.m"); assertTranslatedLines(translation, "jint a = JreLoadStatic(Test, i);", "jint b = (Test_Inner_getTest(), JreLoadStatic(Test, i));", "jint c = (*(Test_Inner_getTest(), JreLoadStaticRef(Test, i)))++;", "jint d = *(Test_Inner_getTest(), JreLoadStaticRef(Test, i)) = 6;"); } public void testStaticLoadWithArrayAccess() throws IOException { String translation = translateSourceFile( "class Test { static class Inner { static int[] ints; } " + " int test() { Inner.ints[0] = 1; Inner.ints[0] += 2; return Inner.ints[0]; } }", "Test", "Test.m"); assertTranslatedLines(translation, "*IOSIntArray_GetRef(nil_chk(JreLoadStatic(Test_Inner, ints)), 0) = 1;", "*IOSIntArray_GetRef(JreLoadStatic(Test_Inner, ints), 0) += 2;", "return IOSIntArray_Get(JreLoadStatic(Test_Inner, ints), 0);"); } }