/**
* Copyright 2011-2017 Asakusa Framework Team.
*
* 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.asakusafw.operator.dmdl;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import com.asakusafw.operator.AnnotationProcessing;
import com.asakusafw.operator.Constants;
import com.asakusafw.operator.OperatorCompilerTestRoot;
import com.asakusafw.operator.model.DataModelMirror;
import com.asakusafw.operator.model.PropertyMirror;
import com.asakusafw.runtime.value.DecimalOption;
import com.asakusafw.runtime.value.FloatOption;
import com.asakusafw.runtime.value.IntOption;
/**
* Test for {@link DmdlDataModelMirrorRepository}.
*/
public class DmdlDataModelMirrorRepositoryTest {
/**
* APT emulator.
*/
@Rule
public final AnnotationProcessing apt = new AnnotationProcessing() {
@Override
protected void beforeCompile(OperatorCompilerTestRoot runner) {
runner.addSpiDataModelMirrorRepositories(DmdlDataModelMirrorRepositoryTest.class.getClassLoader());
runner.add("THolder", String.format("public abstract class THolder<T extends %s> extends %s {}",
MockIntProjection.class.getName(),
Constants.TYPE_FLOW_DESCRIPTION.getClassName()));
runner.add("TOther", String.format("public abstract class TOther<T extends %s> extends %s {}",
MockFloatProjection.class.getName(),
Constants.TYPE_FLOW_DESCRIPTION.getClassName()));
}
};
/**
* Loads a concrete DMDL data model.
*/
@Test
public void load_concrete() {
DataModelMirror mirror = apt.env.findDataModel(apt.getType(MockDataModel.class));
assertThat(mirror, is(notNullValue()));
assertThat(mirror.getKind(), is(DataModelMirror.Kind.CONCRETE));
PropertyMirror pInt = mirror.findProperty("int");
assertThat(pInt, is(notNullValue()));
assertThat(pInt.getType(), is(apt.sameType(apt.getType(IntOption.class))));
PropertyMirror pFloat = mirror.findProperty("float");
assertThat(pFloat, is(notNullValue()));
assertThat(pFloat.getType(), is(apt.sameType(apt.getType(FloatOption.class))));
PropertyMirror pDecimal = mirror.findProperty("mutiple_segments_named");
assertThat(pDecimal, is(notNullValue()));
assertThat(pDecimal.getType(), is(apt.sameType(apt.getType(DecimalOption.class))));
}
/**
* Loads a partial DMDL data model.
*/
@Test
public void load_partial() {
DataModelMirror mirror = apt.env.findDataModel(apt.getTypeVariable("THolder", "T"));
assertThat(mirror, is(notNullValue()));
assertThat(mirror.getKind(), is(DataModelMirror.Kind.PARTIAL));
PropertyMirror pInt = mirror.findProperty("int");
assertThat(pInt, is(notNullValue()));
assertThat(pInt.getType(), is(apt.sameType(apt.getType(IntOption.class))));
}
/**
* Loads a not DMDL model class.
*/
@Test
public void load_normal_class() {
DataModelMirror mirror = apt.env.findDataModel(apt.getType(String.class));
assertThat(mirror, is(nullValue()));
}
/**
* Loads a not DMDL model variable.
*/
@Test
public void load_normal_variable() {
DataModelMirror mirror = apt.env.findDataModel(apt.getTypeVariable("TOther", "T"));
assertThat(mirror, is(nullValue()));
}
}