/* * Copyright 2013 Jake Wharton * Copyright 2014 Prateek Srivastava (@f2prateek) * * 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.f2prateek.dart.processor; import com.google.common.base.Joiner; import com.google.testing.compile.JavaFileObjects; import javax.tools.JavaFileObject; import org.junit.Test; import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource; import static com.google.common.truth.Truth.assert_; /** * Tests {@link com.f2prateek.dart.processor.InjectExtraProcessor}. * For tests related to Parceler, but Parceler is not available. */ public class InjectExtraWithoutParcelerTest { @Test public void serializableCollection() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestSerializableCollection", Joiner.on('\n').join( // "package test;", // "import android.app.Activity;", // "import com.f2prateek.dart.InjectExtra;", // "import java.lang.Object;", // "import java.lang.String;", // "import java.util.ArrayList;", // "public class TestSerializableCollection extends Activity {", // " @InjectExtra(\"key\") ArrayList<String> extra;", // "}" // )); JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/TestSerializableCollection$$ExtraInjector", Joiner.on('\n').join( // "package test;", // "import com.f2prateek.dart.Dart;", // "import java.lang.Object;", // "import java.lang.String;", // "import java.util.ArrayList;", // "public class TestSerializableCollection$$ExtraInjector {", // " public static void inject(Dart.Finder finder, TestSerializableCollection target, Object source) {", // " Object object;", // " object = finder.getExtra(source, \"key\");", // " if (object == null) {", // " throw new IllegalStateException(\"Required extra with key 'key' for field 'extra' was not found. If this extra is optional add '@Nullable' annotation.\");", // " }", // " target.extra = (ArrayList<String>) object;", // " }", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.dartProcessorsWithoutParceler()) .compilesWithoutError() .and() .generatesSources(expectedSource); } @Test public void nonSerializableNonParcelableCollection_withoutParceler() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestNonSerializableNonParcelableCollection_withoutParceler", Joiner.on('\n').join( // "package test;", // "import android.app.Activity;", // "import com.f2prateek.dart.InjectExtra;", // "import java.lang.Object;", // "import java.lang.String;", // "import java.util.List;", // "public class TestNonSerializableNonParcelableCollection_withoutParceler extends Activity {", // " @InjectExtra(\"key\") List<String> extra;", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.dartProcessorsWithoutParceler()) .failsToCompile() .withErrorContaining("@InjectExtra field must be a primitive or Serializable or Parcelable" + " (test.TestNonSerializableNonParcelableCollection_withoutParceler.extra). If you use Parceler, all types supported by Parceler are allowed."); } @Test public void parcelAnnotatedType() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestParcelAnnotated", Joiner.on('\n').join( // "package test;", // "import android.app.Activity;", // "import com.f2prateek.dart.InjectExtra;", // "import java.lang.Object;", // "import java.lang.String;", // "import org.parceler.Parcel;", // "public class TestParcelAnnotated extends Activity {", // " @InjectExtra(\"key\") Foo extra;", // "@Parcel static class Foo {}", // "}" )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.dartProcessorsWithoutParceler()) .failsToCompile() .withErrorContaining("@InjectExtra field must be a primitive or Serializable or Parcelable" + " (test.TestParcelAnnotated.extra). If you use Parceler, all types supported by Parceler are allowed."); } @Test public void collectionOfParcelAnnotatedType() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestCollectionParcel", Joiner.on('\n').join( // "package test;", // "import android.app.Activity;", // "import com.f2prateek.dart.InjectExtra;", // "import java.lang.Object;", // "import java.lang.String;", // "import java.util.List;", // "import org.parceler.Parcel;", // "public class TestCollectionParcel extends Activity {", // " @InjectExtra(\"key\") List<Foo> extra;", // "@Parcel static class Foo {}", // "}" )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.dartProcessorsWithoutParceler()) .failsToCompile() .withErrorContaining("@InjectExtra field must be a primitive or Serializable or Parcelable" + " (test.TestCollectionParcel.extra). If you use Parceler, all types supported by Parceler are allowed."); } @Test public void injectingParcelableThatExtendsParcelableExtra() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestParcelableExtendsParcelable", Joiner.on('\n').join( // "package test;", // "import android.app.Activity;", // "import android.os.Parcelable;", // "import com.f2prateek.dart.InjectExtra;", // "class ExtraParent implements Parcelable {", // " public void writeToParcel(android.os.Parcel out, int flags) {", // " }", // " public int describeContents() {", // " return 0;", // " }", // "}", // "class Extra extends ExtraParent implements Parcelable {", // " public void writeToParcel(android.os.Parcel out, int flags) {", // " }", // " public int describeContents() {", // " return 0;", // " }", // "}", // "public class TestParcelableExtendsParcelable extends Activity {", // " @InjectExtra(\"key\") Extra extra;", // "}" // )); JavaFileObject builderSource = JavaFileObjects.forSourceString("test/Test$$ExtraInjector", Joiner.on('\n').join( // "package test;", // "import com.f2prateek.dart.Dart;", // "import java.lang.Object;", // "public class TestParcelableExtendsParcelable$$ExtraInjector {", // " public static void inject(Dart.Finder finder, TestParcelableExtendsParcelable target, Object source) {", // " Object object;", // " object = finder.getExtra(source, \"key\");", // " if (object == null) {", // " throw new IllegalStateException(\"Required extra with key 'key' for field 'extra' was not found. If this extra is optional add '@Nullable' annotation.\");", // " }", // " target.extra = (Extra) object;", // " }", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.dartProcessorsWithoutParceler()) .compilesWithoutError() .and() .generatesSources(builderSource); } }