/** * * Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved. * * 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.speedment.tool.core.component; import com.speedment.generator.core.GeneratorBundle; import com.speedment.runtime.config.Dbms; import com.speedment.runtime.config.Project; import com.speedment.runtime.config.Schema; import com.speedment.runtime.config.mutator.DbmsMutator; import com.speedment.runtime.core.ApplicationBuilder; import com.speedment.runtime.core.Speedment; import com.speedment.runtime.core.internal.util.ImmutableListUtil; import com.speedment.tool.config.*; import com.speedment.tool.config.component.DocumentPropertyComponent; import com.speedment.tool.config.internal.component.DocumentPropertyComponentImpl; import com.speedment.tool.core.ToolBundle; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import java.util.stream.Stream; import static org.junit.Assert.assertEquals; /** * * @author Emil Forslund */ public class DocumentPropertyComponentImplTest { private Speedment speedment; private DocumentPropertyComponent component; @Before public void setUp() { speedment = ApplicationBuilder.empty() .withBundle(GeneratorBundle.class) .withBundle(ToolBundle.class) .withSkipCheckDatabaseConnectivity() .withSkipValidateRuntimeConfig() .build(); component = speedment.getOrThrow(DocumentPropertyComponent.class); } @Test @Ignore public void testStructure() { final Field root; try { root = DocumentPropertyComponentImpl.class.getDeclaredField("root"); root.setAccessible(true); final Method toString = root.getType().getMethod("toString"); final Object rootObj = root.get(component); if (rootObj == null) { throw new NullPointerException("Root is null."); } final Object o = toString.invoke(rootObj); //System.out.println(o); } catch (final NoSuchFieldException | NoSuchMethodException | SecurityException | IllegalAccessException | InvocationTargetException ex) { throw new RuntimeException("Could not call toString on component", ex); } } @Test public void testDefaultInstallments() { final DocumentProperty project = component.getConstructor(DocumentPropertyComponent.PROJECTS).create(null); final DocumentProperty dbms = component.getConstructor(DocumentPropertyComponent.DBMSES).create(project); final DocumentProperty schema = component.getConstructor(DocumentPropertyComponent.SCHEMAS).create(dbms); final DocumentProperty table = component.getConstructor(DocumentPropertyComponent.TABLES).create(schema); final DocumentProperty column = component.getConstructor(DocumentPropertyComponent.COLUMNS).create(table); final DocumentProperty index = component.getConstructor(DocumentPropertyComponent.INDEXES).create(table); final DocumentProperty indexColumn = component.getConstructor(DocumentPropertyComponent.INDEX_COLUMNS).create(index); final DocumentProperty foreignKey = component.getConstructor(DocumentPropertyComponent.FOREIGN_KEYS).create(table); final DocumentProperty foreignKeyColumn = component.getConstructor(DocumentPropertyComponent.FOREIGN_KEY_COLUMNS).create(foreignKey); final DocumentProperty primaryKey = component.getConstructor(DocumentPropertyComponent.PRIMARY_KEY_COLUMNS).create(table); assertEquals("Make sure ProjectProperty is used by default: ", ProjectProperty.class, project.getClass()); assertEquals("Make sure DbmsProperty is used by default: ", DbmsProperty.class, dbms.getClass()); assertEquals("Make sure SchemaProperty is used by default: ", SchemaProperty.class, schema.getClass()); assertEquals("Make sure TableProperty is used by default: ", TableProperty.class, table.getClass()); assertEquals("Make sure ColumnProperty is used by default: ", ColumnProperty.class, column.getClass()); assertEquals("Make sure IndexProperty is used by default: ", IndexProperty.class, index.getClass()); assertEquals("Make sure IndexColumnProperty is used by default: ", IndexColumnProperty.class, indexColumn.getClass()); assertEquals("Make sure ForeignKeyProperty is used by default: ", ForeignKeyProperty.class, foreignKey.getClass()); assertEquals("Make sure ForeignKeyColumnProperty is used by default: ", ForeignKeyColumnProperty.class, foreignKeyColumn.getClass()); assertEquals("Make sure PrimaryKeyColumnProperty is used by default: ", PrimaryKeyColumnProperty.class, primaryKey.getClass()); } @Test public void testAlternateInstallments() { component.setConstructor(parent -> new AlternativeDbms((Project) parent), DocumentPropertyComponent.DBMSES); final DocumentProperty project = component.getConstructor(DocumentPropertyComponent.PROJECTS).create(null); final DocumentProperty dbms = component.getConstructor(DocumentPropertyComponent.DBMSES).create(project); assertEquals(ProjectProperty.class, project.getClass()); assertEquals(AlternativeDbms.class, dbms.getClass()); } private final static class AlternativeDbms extends AbstractChildDocumentProperty<Project, AlternativeDbms> implements Dbms { public AlternativeDbms(Project parent) { super(parent); } @Override protected List<String> keyPathEndingWith(String key) { return ImmutableListUtil.concat(DocumentPropertyComponent.DBMSES, key); } @Override public DbmsMutator<Dbms> mutator() { throw new UnsupportedOperationException("Not required by test."); } @Override public Stream<? extends Schema> schemas() { throw new UnsupportedOperationException("Not required by test."); } } }