/*
* Copyright 2003-2016 JetBrains s.r.o.
*
* 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 jetbrains.mps.persistence;
import jetbrains.mps.CoreMpsTest;
import jetbrains.mps.PlatformMpsTest;
import jetbrains.mps.smodel.SNodeUtil;
import jetbrains.mps.smodel.tempmodel.TempModuleOptions;
import jetbrains.mps.smodel.tempmodel.TemporaryModels;
import jetbrains.mps.testbench.WriteAction;
import jetbrains.mps.util.EqualUtil;
import jetbrains.mps.util.Reference;
import org.jdom.Element;
import org.jetbrains.mps.openapi.language.SProperty;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SReference;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import java.util.Iterator;
public class PersistenceUtilTest extends CoreMpsTest {
@Rule
public WriteAction wa = new WriteAction(); // FIXME shall pass proper ModelAccess in there
private SModel createTestModel() {
SModel result = TemporaryModels.getInstance().create(false, TempModuleOptions.forDefaultModule());
result.addRootNode(new jetbrains.mps.smodel.SNode(SNodeUtil.concept_BaseConcept));
return result;
}
private boolean modelsEquals(SModel a, SModel b) {
Iterator<? extends SNode> aRoots = a.getRootNodes().iterator();
Iterator<? extends SNode> bRoots = b.getRootNodes().iterator();
while (aRoots.hasNext() || bRoots.hasNext()) {
if (!aRoots.hasNext() || !bRoots.hasNext()) {
return false;
}
if (!nodesEquals(aRoots.next(), bRoots.next())) {
return false;
}
}
return true;
}
private boolean nodesEquals(SNode a, SNode b) {
if (!EqualUtil.equals(a.getConcept(), b.getConcept())) {
return false;
}
if (!EqualUtil.equals(a.getNodeId(), b.getNodeId())) {
return false;
}
Iterator<? extends SNode> aChildren = a.getChildren().iterator();
Iterator<? extends SNode> bChildren = b.getChildren().iterator();
while (aChildren.hasNext() || bChildren.hasNext()) {
if (!aChildren.hasNext() || !bChildren.hasNext()) {
return false;
}
if (!nodesEquals(aChildren.next(), bChildren.next())) {
return false;
}
}
Iterator<SProperty> aProperties = a.getProperties().iterator();
Iterator<SProperty> bProperties = b.getProperties().iterator();
while (aProperties.hasNext() || bProperties.hasNext()) {
if (!aProperties.hasNext() || !bProperties.hasNext()) {
return false;
}
if (!EqualUtil.equals(aProperties.next(), bProperties.next())) {
return false;
}
}
Iterator<? extends SReference> aReferences = a.getReferences().iterator();
Iterator<? extends SReference> bReferences = b.getReferences().iterator();
while (aReferences.hasNext() || bReferences.hasNext()) {
if (!aReferences.hasNext() || !bReferences.hasNext()) {
return false;
}
SReference aRef = aReferences.next();
SReference bRef = bReferences.next();
if (!EqualUtil.equals(aRef.getLink(), bRef.getLink())) {
return false;
}
if (!EqualUtil.equals(aRef.getTargetNodeReference(), bRef.getTargetNodeReference())) {
return false;
}
}
return true;
}
@Test
public void binaryModelPersistence() {
SModel original = createTestModel();
byte[] saved = PersistenceUtil.saveBinaryModel(original);
SModel loaded = PersistenceUtil.loadBinaryModel(saved);
Assert.assertTrue(modelsEquals(original, loaded));
}
@Test
public void doubleBinary() {
SModel original = createTestModel();
byte[] saved1 = PersistenceUtil.saveBinaryModel(original);
SModel loaded1 = PersistenceUtil.loadBinaryModel(saved1);
byte[] saved2 = PersistenceUtil.saveBinaryModel(loaded1);
SModel loaded2 = PersistenceUtil.loadBinaryModel(saved2);
Assert.assertTrue(modelsEquals(original, loaded2));
}
@Test
public void xmlModelPersistence() {
SModel original = createTestModel();
Element saved = PersistenceUtil.saveModelToXml(original);
SModel loaded = PersistenceUtil.loadModelFromXml(saved);
Assert.assertTrue(modelsEquals(original, loaded));
}
@Test
public void doubleXml() {
SModel original = createTestModel();
Element saved1 = PersistenceUtil.saveModelToXml(original);
SModel loaded1 = PersistenceUtil.loadModelFromXml(saved1);
Element saved2 = PersistenceUtil.saveModelToXml(loaded1);
SModel loaded2 = PersistenceUtil.loadModelFromXml(saved2);
Assert.assertTrue(modelsEquals(original, loaded2));
}
@Test
public void binaryToXml() {
SModel original = createTestModel();
byte[] binary = PersistenceUtil.saveBinaryModel(original);
SModel loadedFromBinary = PersistenceUtil.loadBinaryModel(binary);
Element savedToXml = PersistenceUtil.saveModelToXml(loadedFromBinary);
SModel loadedFromXml = PersistenceUtil.loadModelFromXml(savedToXml);
Assert.assertTrue(modelsEquals(original, loadedFromXml));
}
@Test
public void xmlToBinary() {
SModel original = createTestModel();
Element xml = PersistenceUtil.saveModelToXml(original);
SModel loadedFromXml = PersistenceUtil.loadModelFromXml(xml);
byte[] savedToBinary = PersistenceUtil.saveBinaryModel(loadedFromXml);
SModel loadedFromBinary = PersistenceUtil.loadBinaryModel(savedToBinary);
Assert.assertTrue(modelsEquals(original, loadedFromBinary));
}
}