/** * 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.testdriver.loader; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.math.BigDecimal; import java.util.Comparator; import java.util.List; import org.junit.Rule; import org.junit.Test; import com.asakusafw.runtime.core.GroupView; import com.asakusafw.runtime.core.View; import com.asakusafw.runtime.value.DecimalOption; import com.asakusafw.runtime.value.IntOption; import com.asakusafw.runtime.value.StringOption; import com.asakusafw.testdriver.FileSystemCleaner; import com.asakusafw.testdriver.core.DataModelDefinition; import com.asakusafw.testdriver.core.DataModelReflection; import com.asakusafw.testdriver.core.DataModelSource; import com.asakusafw.testdriver.core.DataModelSourceFactory; import com.asakusafw.testdriver.core.TestContext; import com.asakusafw.testdriver.model.DefaultDataModelDefinition; /** * Test for {@link BasicDataLoader}. */ public class BasicDataLoaderTest { static final DataModelDefinition<MockDataModel> DEF = new DefaultDataModelDefinition<>(MockDataModel.class); /** * Resets all Hadoop file systems. */ @Rule public final FileSystemCleaner fsCleaner = new FileSystemCleaner(); /** * simple case. */ @Test public void simple() { List<MockDataModel> list = loader(new MockDataModel("Hello, world!")) .asList(); assertThat(list, contains(new MockDataModel("Hello, world!"))); } /** * as list. */ @Test public void list() { List<MockDataModel> results = loader( new MockDataModel("A"), new MockDataModel("B"), new MockDataModel("C")) .asList(); assertThat(results, containsInAnyOrder( new MockDataModel("A"), new MockDataModel("B"), new MockDataModel("C"))); } /** * as view. */ @Test public void view() { View<MockDataModel> results = loader( new MockDataModel("A"), new MockDataModel("B"), new MockDataModel("C")) .asView(); assertThat(results, containsInAnyOrder( new MockDataModel("A"), new MockDataModel("B"), new MockDataModel("C"))); } /** * order by property. */ @Test public void order_property() { List<MockDataModel> list = loader( new MockDataModel(5, "A"), new MockDataModel(2, "B"), new MockDataModel(1, "C"), new MockDataModel(3, "D"), new MockDataModel(4, "E")) .order("key") .asList(); assertThat(list, contains( new MockDataModel(1, "C"), new MockDataModel(2, "B"), new MockDataModel(3, "D"), new MockDataModel(4, "E"), new MockDataModel(5, "A"))); } /** * order by property. */ @Test public void order_property_invert() { List<MockDataModel> list = loader( new MockDataModel(5, "A"), new MockDataModel(2, "B"), new MockDataModel(1, "C"), new MockDataModel(3, "D"), new MockDataModel(4, "E")) .order("key DESC") .asList(); assertThat(list, contains( new MockDataModel(5, "A"), new MockDataModel(4, "E"), new MockDataModel(3, "D"), new MockDataModel(2, "B"), new MockDataModel(1, "C"))); } /** * order by comparator. */ @Test public void order_comparator() { List<MockDataModel> list = loader( new MockDataModel(5, "A"), new MockDataModel(2, "B"), new MockDataModel(1, "C"), new MockDataModel(3, "D"), new MockDataModel(4, "E")) .order(Comparator.comparing(MockDataModel::getKeyOption)) .asList(); assertThat(list, contains( new MockDataModel(1, "C"), new MockDataModel(2, "B"), new MockDataModel(3, "D"), new MockDataModel(4, "E"), new MockDataModel(5, "A"))); } /** * group - simple case. */ @Test public void group() { GroupView<MockDataModel> results = loader( new MockDataModel(0, "A"), new MockDataModel(1, "B"), new MockDataModel(1, "C"), new MockDataModel(2, "D")) .group("key") .asView(); assertThat(results.find(k(0)), containsInAnyOrder( new MockDataModel(0, "A"))); assertThat(results.find(k(1)), containsInAnyOrder( new MockDataModel(1, "B"), new MockDataModel(1, "C"))); assertThat(results.find(k(2)), containsInAnyOrder( new MockDataModel(2, "D"))); assertThat(results.find(k(3)), hasSize(0)); assertThat(results, containsInAnyOrder( new MockDataModel(0, "A"), new MockDataModel(1, "B"), new MockDataModel(1, "C"), new MockDataModel(2, "D"))); } /** * group - order by property. */ @Test public void group_order_property() { GroupView<MockDataModel> results = loader( new MockDataModel(0, d(0), "A"), new MockDataModel(1, d(3), "B"), new MockDataModel(1, d(1), "C"), new MockDataModel(1, d(2), "D")) .group("key") .order("sort") .asView(); assertThat(results.find(k(0)), contains( new MockDataModel(0, d(0), "A"))); assertThat(results.find(k(1)), contains( new MockDataModel(1, d(1), "C"), new MockDataModel(1, d(2), "D"), new MockDataModel(1, d(3), "B"))); } /** * group - order by property. */ @Test public void group_order_property_invert() { GroupView<MockDataModel> results = loader( new MockDataModel(0, d(0), "A"), new MockDataModel(1, d(3), "B"), new MockDataModel(1, d(1), "C"), new MockDataModel(1, d(2), "D")) .group("key") .order("-sort") .asView(); assertThat(results.find(k(0)), contains( new MockDataModel(0, d(0), "A"))); assertThat(results.find(k(1)), contains( new MockDataModel(1, d(3), "B"), new MockDataModel(1, d(2), "D"), new MockDataModel(1, d(1), "C"))); } /** * group - order by property. */ @Test public void group_order_comparator() { GroupView<MockDataModel> results = loader( new MockDataModel(0, d(0), "A"), new MockDataModel(1, d(3), "B"), new MockDataModel(1, d(1), "C"), new MockDataModel(1, d(2), "D")) .group("key") .order(Comparator.comparing(MockDataModel::getSortOption)) .asView(); assertThat(results.find(k(0)), contains( new MockDataModel(0, d(0), "A"))); assertThat(results.find(k(1)), contains( new MockDataModel(1, d(1), "C"), new MockDataModel(1, d(2), "D"), new MockDataModel(1, d(3), "B"))); } /** * group - ordered. */ @Test public void group_ordered() { GroupView<MockDataModel> results = loader( new MockDataModel(0, d(0), "A"), new MockDataModel(1, d(3), "B"), new MockDataModel(1, d(1), "C"), new MockDataModel(1, d(2), "D")) .order("sort") .group("key") .asView(); assertThat(results.find(k(0)), contains( new MockDataModel(0, d(0), "A"))); assertThat(results.find(k(1)), contains( new MockDataModel(1, d(1), "C"), new MockDataModel(1, d(2), "D"), new MockDataModel(1, d(3), "B"))); } /** * group - validate key element count. */ @Test public void group_validate_count() { GroupView<MockDataModel> results = loader() .group("key", "sort") .asView(); assertThat(results.find(new IntOption(), new DecimalOption()), hasSize(0)); fail(() -> results.find()); fail(() -> results.find(new IntOption())); fail(() -> results.find(new IntOption(), new DecimalOption(), new StringOption())); } /** * group - validate key element type. */ @Test public void group_validate_type() { GroupView<MockDataModel> results = loader() .group("key", "sort") .asView(); assertThat(results.find(new IntOption(0), new DecimalOption(d(0))), hasSize(0)); fail(() -> results.find(new StringOption(""), new DecimalOption(d(0)))); fail(() -> results.find(new IntOption(0), new StringOption(""))); } private static void fail(Runnable r) { try { r.run(); throw new AssertionError(); } catch (RuntimeException e) { // ok } } private static BigDecimal d(long value) { return BigDecimal.valueOf(value); } private static IntOption k(int value) { return new IntOption(value); } private static BasicDataLoader<MockDataModel> loader(MockDataModel... objects) { return new BasicDataLoader<>(new TestContext.Empty(), DEF, factory(objects)); } private static DataModelSourceFactory factory(MockDataModel... objects) { return new DataModelSourceFactory() { @Override public <T> DataModelSource createSource(DataModelDefinition<T> definition, TestContext context) { return new DataModelSource() { int index = 0; @Override public DataModelReflection next() { if (index >= objects.length) { return null; } return DEF.toReflection(objects[index++]); } @Override public void close() { return; } }; } }; } }