/*
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.litho.specmodels.generator;
import com.facebook.litho.specmodels.internal.ImmutableList;
import com.facebook.litho.specmodels.model.DelegateMethodModel;
import com.facebook.litho.specmodels.model.DependencyInjectionHelper;
import com.facebook.litho.specmodels.model.SpecModel;
import com.facebook.litho.specmodels.model.SpecModelImpl;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import org.junit.Before;
import org.junit.Test;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Tests {@link PreambleGenerator}
*/
public class PreambleGeneratorTest {
private static final String TEST_QUALIFIED_SPEC_NAME = "com.facebook.litho.TestSpec";
private final DependencyInjectionHelper mDependencyInjectionHelper =
mock(DependencyInjectionHelper.class);
private SpecModel mSpecModelWithoutDI;
private SpecModel mSpecModelWithDI;
@Before
public void setUp() {
mSpecModelWithoutDI = SpecModelImpl.newBuilder()
.qualifiedSpecClassName(TEST_QUALIFIED_SPEC_NAME)
.delegateMethods(ImmutableList.<DelegateMethodModel>of())
.representedObject(new Object())
.build();
mSpecModelWithDI = SpecModelImpl.newBuilder()
.qualifiedSpecClassName(TEST_QUALIFIED_SPEC_NAME)
.delegateMethods(ImmutableList.<DelegateMethodModel>of())
.dependencyInjectionGenerator(mDependencyInjectionHelper)
.representedObject(new Object())
.build();
}
@Test
public void testGenerateConstructorWithoutDependencyInjection() {
TypeSpecDataHolder typeSpecDataHolder =
PreambleGenerator.generateConstructor(mSpecModelWithoutDI);
assertThat(typeSpecDataHolder.getFieldSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getMethodSpecs().size()).isEqualTo(1);
assertThat(typeSpecDataHolder.getTypeSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getMethodSpecs().get(0).toString()).isEqualTo(
"private Constructor() {\n" +
"}\n");
}
@Test
public void testGenerateConstructorWithDependencyInjection() {
MethodSpec constructor = MethodSpec.constructorBuilder().build();
when(mDependencyInjectionHelper.generateConstructor(mSpecModelWithDI))
.thenReturn(constructor);
TypeSpecDataHolder typeSpecDataHolder = PreambleGenerator.generateConstructor(mSpecModelWithDI);
assertThat(typeSpecDataHolder.getFieldSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getMethodSpecs().size()).isEqualTo(1);
assertThat(typeSpecDataHolder.getTypeSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getMethodSpecs().get(0)).isSameAs(constructor);
}
@Test
public void testGenerateSourceDelegateWithoutDependencyInjection() {
TypeSpecDataHolder typeSpecDataHolder =
PreambleGenerator.generateSourceDelegate(mSpecModelWithoutDI);
assertThat(typeSpecDataHolder.getFieldSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getMethodSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getTypeSpecs().size()).isEqualTo(0);
}
@Test
public void testGenerateSourceDelegateWithDependencyInjection() {
when(mDependencyInjectionHelper.getSourceDelegateTypeName(mSpecModelWithDI))
.thenReturn(
ParameterizedTypeName.get(
ClassName.bestGuess("Lazy"),
mSpecModelWithDI.getSpecTypeName()));
TypeSpecDataHolder typeSpecDataHolder =
PreambleGenerator.generateSourceDelegate(mSpecModelWithDI);
assertThat(typeSpecDataHolder.getFieldSpecs().size()).isEqualTo(1);
assertThat(typeSpecDataHolder.getMethodSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getTypeSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getFieldSpecs().get(0).toString()).isEqualTo(
"private Lazy<com.facebook.litho.TestSpec> mSpec;\n");
}
@Test
public void testGenerateGetterWithoutDependencyInjection() {
TypeSpecDataHolder typeSpecDataHolder = PreambleGenerator.generateGetter(mSpecModelWithoutDI);
assertThat(typeSpecDataHolder.getFieldSpecs().size()).isEqualTo(1);
assertThat(typeSpecDataHolder.getMethodSpecs().size()).isEqualTo(1);
assertThat(typeSpecDataHolder.getTypeSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getFieldSpecs().get(0).toString()).isEqualTo(
"private static com.facebook.litho.Test sInstance = null;\n");
assertThat(typeSpecDataHolder.getMethodSpecs().get(0).toString()).isEqualTo(
"public static synchronized com.facebook.litho.Test get() {\n" +
" if (sInstance == null) {\n" +
" sInstance = new com.facebook.litho.Test();\n" +
" }\n" +
" return sInstance;\n" +
"}\n");
}
@Test
public void testGenerateGetterWithDependencyInjection() {
TypeSpecDataHolder typeSpecDataHolder = PreambleGenerator.generateGetter(mSpecModelWithDI);
assertThat(typeSpecDataHolder.getFieldSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getMethodSpecs().size()).isEqualTo(1);
assertThat(typeSpecDataHolder.getTypeSpecs().size()).isEqualTo(0);
assertThat(typeSpecDataHolder.getMethodSpecs().get(0).toString()).isEqualTo(
"public com.facebook.litho.Test get() {\n" +
" return this;\n" +
"}\n");
}
}