/*
* Copyright (c) 2006 Borland Software Corporation
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Artem Tikhomirov (Borland) - initial API and implementation
*/
package org.eclipse.gmf.tests.tr;
import java.io.ByteArrayInputStream;
import java.net.URL;
import java.util.Properties;
import junit.framework.TestCase;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.codegen.merge.java.JControlModel;
import org.eclipse.emf.codegen.merge.java.JMerger;
import org.eclipse.emf.codegen.util.CodeGenUtil;
import org.eclipse.gmf.internal.common.codegen.DefaultTextMerger;
import org.eclipse.gmf.internal.common.codegen.TextMerger;
/**
* @author artem
*/
public class TestDefaultMergeService extends TestCase {
private DefaultTextMerger myMergeService;
public TestDefaultMergeService(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
URL controlFile = Platform.getBundle("org.eclipse.gmf.codegen").getEntry("/templates/emf-merge.xml");
JControlModel controlModel = new JControlModel();
controlModel.initialize(CodeGenUtil.instantiateFacadeHelper(JMerger.DEFAULT_FACADE_HELPER_CLASS), controlFile.toString());
assertTrue(controlModel.canMerge());
myMergeService = createMergeService(controlModel);
}
protected final DefaultTextMerger createMergeService(JControlModel controlModel) {
return new DefaultTextMerger(controlModel);
}
public void testProcessHitRightMethod() {
final boolean[] hitXML = new boolean[1];
final boolean[] hitPluginXML = new boolean[1];
final boolean[] hitManifestMF = new boolean[1];
class TextMergeHitTest extends TextMerger {
@Override
public String mergeXML(String oldText, String newText) {
hitXML[0] = true;
return super.mergeXML(oldText, newText);
}
@Override
public String mergePluginXML(String oldText, String newText) {
hitPluginXML[0] = true;
return super.mergePluginXML(oldText, newText);
}
@Override
public String mergeManifestMF(String oldText, String newText) {
hitManifestMF[0] = true;
return super.mergeManifestMF(oldText, newText);
}
}
TextMergeHitTest hitTest = new TextMergeHitTest();
hitXML[0] = hitPluginXML[0] = hitManifestMF[0] = false;
hitTest.process("MANIFEST.MF", "", "");
assertTrue(!hitXML[0] && !hitPluginXML[0] && hitManifestMF[0]);
hitXML[0] = hitPluginXML[0] = hitManifestMF[0] = false;
hitTest.process("sample.xml", "", "");
assertTrue(hitXML[0] && !hitPluginXML[0] && !hitManifestMF[0]);
hitXML[0] = hitPluginXML[0] = hitManifestMF[0] = false;
hitTest.process("plugin.xml", "", "");
assertTrue(!hitXML[0] && hitPluginXML[0] && !hitManifestMF[0]);
}
public void testProperties() throws Exception {
final String oldContent = "prop1=value1\n" + "prop2=value2\n" + "#propRemoved=\n" + "propAdded=newValue\n" + "prop3=value3\n";
final String newContent = "prop1=value1\n" + "prop2=modifiedValue2\n" + "propRemoved=someValue\n" + "prop3=value3\n";
String merged = myMergeService.mergeProperties(oldContent, newContent);
assertNotNull(merged);
Properties result = new Properties();
result.load(new ByteArrayInputStream(merged.getBytes()));
assertEquals(4, result.size());
assertEquals("value1", result.getProperty("prop1"));
assertEquals("value2", result.getProperty("prop2"));
assertEquals("value3", result.getProperty("prop3"));
// check removed property not appear
assertNull(result.getProperty("propRemoved"));
// check added property kept
assertEquals("newValue", result.getProperty("propAdded"));
}
public void testJava() {
final String marker = "/**\n* @generated\n*/\n";
final String oldMethodB = "protected void methodB() {new Object();}";
final String oldJava = marker + "class B {\n" + marker + "public void methodA() {new Object();}\n" + oldMethodB + "\n}";
final String newMethodA = "public void methodA() {new String();}\n";
final String newJava = marker + "class B {\n" + marker + newMethodA + marker + "protected void methodB() {new String();}" + "\n}";
final String mergeRes = myMergeService.mergeJava(oldJava, newJava);
assertEquals(marker + "class B {\n" + marker + newMethodA + oldMethodB + "\n}", mergeRes);
}
public void testJavaMergeNoControlModel() {
DefaultTextMerger mergeServiceNoControl = createMergeService(new JControlModel());
assertEquals("merger with uninitialized control model can't perform merge", getJavaNewText(), mergeServiceNoControl.mergeJava(getJavaOldText(), getJavaNewText()));
}
public void testProcessJava() {
final String javaResult = myMergeService.process("Sample.java", getJavaOldText(), getJavaNewText());
assertEquals(myMergeService.mergeJava(getJavaOldText(), getJavaNewText()), javaResult);
}
public void testProcessXml() {
final String xmlOld = "<p>aaa<i>bbb</i>ccc</p>";
final String xmlNew = "<p>ddd<b>e</b>ccc</p>";
final String xmlResult = myMergeService.process("sample.xml", xmlOld, xmlNew);
assertEquals(myMergeService.mergeXML(xmlOld, xmlNew), xmlResult);
}
public void testProcessProperties() {
final String propOld = "p1=v1\np2=v2\n#p3=\n";
final String propNew = "p1=v1\np2=nv\np3=v3\n";
final String propResult = myMergeService.process("sample.properties", propOld, propNew);
assertEquals(myMergeService.mergeProperties(propOld, propNew), propResult);
}
private String getJavaOldText() {
return "class A {}";
}
private String getJavaNewText() {
return "class D {int c;}";
}
}