/*
* 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;
/**
* Unit tests for {@link EnhancedForRewriter}.
*
* @author Keith Stanger
*/
public class EnhancedForRewriterTest extends GenerationTest {
// Regression test: Must call "charValue" on boxed type returned from iterator.
public void testEnhancedForWithBoxedType() throws IOException {
String source = "import java.util.List;"
+ "public class A { "
+ "Character[] charArray; "
+ "List<Character> charList; "
+ "void test() { for (char c : charArray) {} for (char c : charList) {} } }";
String translation = translateSourceFile(source, "A", "A.m");
assertTranslation(translation,
"jchar c = [((JavaLangCharacter *) nil_chk(*b__++)) charValue];");
assertTranslation(translation,
"jchar c = [((JavaLangCharacter *) nil_chk(boxed__)) charValue];");
}
public void testEnhancedForLoopAnnotation() throws IOException {
String translation = translateSourceFile(
"import com.google.j2objc.annotations.LoopTranslation;"
+ "import com.google.j2objc.annotations.LoopTranslation.LoopStyle;"
+ "class Test { void test(Iterable<String> strings) { "
+ "for (@LoopTranslation(LoopStyle.JAVA_ITERATOR) String s : strings) {}"
+ "for (@LoopTranslation(LoopStyle.FAST_ENUMERATION) String s : strings) {} } }",
"Test", "Test.m");
assertTranslatedLines(translation,
"- (void)testWithJavaLangIterable:(id<JavaLangIterable>)strings {",
"{",
"id<JavaUtilIterator> iter__ = [((id<JavaLangIterable>) nil_chk(strings)) iterator];",
"while ([((id<JavaUtilIterator>) nil_chk(iter__)) hasNext]) {",
"NSString *s = [iter__ next];",
"}",
"}",
"for (NSString * __strong s in strings) {",
"}",
"}");
}
public void testLabeledEnhancedForLoop() throws IOException {
String translation = translateSourceFile(
"import com.google.j2objc.annotations.LoopTranslation;"
+ "import com.google.j2objc.annotations.LoopTranslation.LoopStyle;"
+ " class Test { public void foo(boolean b, java.util.List<Object> list) {"
+ " testLabel1: for (Object o: new Object[] { }) {"
+ " if (b) { break testLabel1; } continue testLabel1; }"
+ " testLabel2: for (@LoopTranslation(LoopStyle.JAVA_ITERATOR) Object o: list) {"
+ " if (b) { break testLabel2; } continue testLabel2; } } }", "Test", "Test.m");
assertTranslatedLines(translation,
"{",
" IOSObjectArray *a__ = [IOSObjectArray arrayWithObjects:"
+ "(id[]){ } count:0 type:NSObject_class_()];",
" id const *b__ = a__->buffer_;",
" id const *e__ = b__ + a__->size_;",
" while (b__ < e__) {",
" {",
" id o = *b__++;",
" if (b) {",
" goto break_testLabel1;",
" }",
" goto continue_testLabel1;",
" }",
" continue_testLabel1: ;",
" }",
" break_testLabel1: ;",
"}",
"{",
" id<JavaUtilIterator> iter__ = [((id<JavaUtilList>) nil_chk(list)) iterator];",
" while ([((id<JavaUtilIterator>) nil_chk(iter__)) hasNext]) {",
" {",
" id o = [iter__ next];",
" if (b) {",
" goto break_testLabel2;",
" }",
" goto continue_testLabel2;",
" }",
" continue_testLabel2: ;",
" }",
" break_testLabel2: ;",
"}");
}
}