/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.queries.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import org.whole.lang.grammars.model.Grammar;
import org.whole.lang.grammars.model.Name;
import org.whole.lang.grammars.reflect.GrammarsEntityDescriptorEnum;
import org.whole.lang.grammars.util.TestXmlGrammar;
import org.whole.lang.matchers.Matcher;
import org.whole.lang.model.IEntity;
import org.whole.lang.models.codebase.ModelsModel;
import org.whole.lang.models.model.CompositeEntity;
import org.whole.lang.models.model.DataEntity;
import org.whole.lang.models.model.Feature;
import org.whole.lang.models.model.Features;
import org.whole.lang.models.model.Model;
import org.whole.lang.models.model.ModelDeclarations;
import org.whole.lang.models.model.SimpleEntity;
import org.whole.lang.models.reflect.ModelsEntityDescriptorEnum;
import org.whole.lang.queries.model.PathExpression;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.templates.ITemplateManager;
import org.whole.lang.util.BehaviorUtils;
import org.whole.lang.util.EntityUtils;
import org.whole.lang.util.StringUtils;
/**
* @author Riccardo Solmi
*/
public class RewriteQueriesTest {
@BeforeClass
public static void deployWholePlatform() {
ReflectionFactory.deployWholePlatform();
}
@Test
public void testDelete1() {
Model model = new ModelsModel().create();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("delete1");
for (DataEntity dataEntity : BehaviorUtils.<DataEntity>compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.DataEntity, dataEntity));
assertFalse(BehaviorUtils.compileAndLazyEvaluate(query, model).hasNext());
}
@Test
public void testDelete2() {
Grammar model = new TestXmlGrammar().create();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("delete2");
for (Name name : BehaviorUtils.<Name>compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(GrammarsEntityDescriptorEnum.Name, name));
for (IEntity name : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(EntityUtils.isResolver(name));
}
@Test
public void testDelete3() {
Grammar model = new TestXmlGrammar().create();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("delete3");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(GrammarsEntityDescriptorEnum.Name, entity) ||
EntityUtils.isResolver(entity));
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(EntityUtils.isResolver(entity));
}
@Test
public void testUpdate1() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update1");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity) ||
Matcher.match(ModelsEntityDescriptorEnum.DataType, entity));
assertEquals("MyModelName", model.getName().getValue());
int j=0;
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl)) {
if (j++ == 0) {
assertEquals("MyFirstName", ((DataEntity) decl).getName().getValue());
assertEquals("MyFirstDataType", ((DataEntity) decl).getDataType().getValue());
} else {
assertEquals("MySecondName", ((DataEntity) decl).getName().getValue());
return;
}
}
}
}
@Test
public void testUpdate2() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update2");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity) ||
Matcher.match(ModelsEntityDescriptorEnum.DataType, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl)) {
assertEquals("MyDataEntityName", ((DataEntity) decl).getName().getValue());
assertEquals("MyDataType", ((DataEntity) decl).getDataType().getValue());
}
}
}
@Test
public void testUpdate3() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update3");
List<String> names = new ArrayList<String>();
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl))
names.add(((DataEntity) decl).getName().getValue());
}
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity));
Iterator<String> iterator = names.iterator();
for (int i=0; i<declarations.wSize() && iterator.hasNext(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.SimpleEntity, decl))
assertEquals(iterator.next(), ((SimpleEntity) decl).getName().getValue());
}
}
@Test
public void testUpdate4() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update4");
List<String> dataEntityNames = new ArrayList<String>();
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl))
dataEntityNames.add(((DataEntity) decl).getName().getValue());
}
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity));
Iterator<String> dataEntityNamesIterator = dataEntityNames.iterator();
for (int i=0; i<declarations.wSize() && dataEntityNamesIterator.hasNext(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.SimpleEntity, decl))
assertEquals(dataEntityNamesIterator.next(), ((SimpleEntity) decl).getName().getValue());
}
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl))
assertTrue(EntityUtils.isResolver(((DataEntity) decl).getName()));
}
}
@Test
public void testUpdate5() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update5");
List<String> dataEntityNames = new ArrayList<String>();
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl))
dataEntityNames.add(((DataEntity) decl).getName().getValue());
}
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity));
Iterator<String> dataEntityNamesIterator = dataEntityNames.iterator();
for (int i=0; i<declarations.wSize() && dataEntityNamesIterator.hasNext(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.SimpleEntity, decl))
assertEquals(dataEntityNamesIterator.next(), ((SimpleEntity) decl).getName().getValue());
}
dataEntityNamesIterator = dataEntityNames.iterator();
for (int i=0; i<declarations.wSize() && dataEntityNamesIterator.hasNext(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.CompositeEntity, decl))
assertEquals(dataEntityNamesIterator.next(), ((CompositeEntity) decl).getName().getValue());
}
}
@Test
public void testUpdate6() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update6");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl))
assertEquals("DataEntityName", ((DataEntity) decl).getName().getValue());
}
}
@Test
public void testUpdate7() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update7");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl))
assertEquals("DataEntityName", ((DataEntity) decl).getName().getValue());
}
}
@Test
public void testUpdate8() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update8");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.DataEntity, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl)) {
assertEquals("Object", ((DataEntity) decl).getDataType().getValue());
assertTrue(((DataEntity) decl).getName().getValue().startsWith("My"));
}
}
}
@Test
public void testUpdate9() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update9");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.DataEntity, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl)) {
assertEquals("Object", ((DataEntity) decl).getDataType().getValue());
assertTrue(((DataEntity) decl).getName().getValue().startsWith("My"));
}
}
}
@Test
public void testUpdate10() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update10");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl)) {
String name = ((DataEntity) decl).getName().getValue();
assertEquals(StringUtils.toLowerCap(name), name);
}
}
}
@Test
public void testUpdate11() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("update11");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.SimpleName, entity) ||
Matcher.match(ModelsEntityDescriptorEnum.DataType, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.DataEntity, decl)) {
String name = ((DataEntity) decl).getName().getValue();
assertEquals(StringUtils.toLowerCap(name), name);
assertEquals("MyDataType", ((DataEntity) decl).getDataType().getValue());
}
}
}
@Test
public void testInsert1() {
Model model = new ModelsModel().create();
ModelDeclarations declarations = model.getDeclarations();
ITemplateManager tm = RewriteQueriesTemplateManager.instance();
PathExpression query = (PathExpression) tm.create("insert1");
for (IEntity entity : BehaviorUtils.compileAndLazyEvaluate(query, model))
assertTrue(Matcher.match(ModelsEntityDescriptorEnum.Feature, entity));
for (int i=0; i<declarations.wSize(); i++) {
IEntity decl = declarations.wGet(i);
if (Matcher.match(ModelsEntityDescriptorEnum.SimpleEntity, decl)) {
Features features = ((SimpleEntity) decl).getFeatures();
int size = features.wSize();
assertTrue(size >= 2);
String name1 = ((Feature) features.wGet(size-2)).getName().getValue();
assertEquals("n1", name1);
String name2 = ((Feature) features.wGet(size-1)).getName().getValue();
assertEquals("n2", name2);
}
}
}
}