/******************************************************************************* | |
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved. | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* Oracle - initial API and implementation from Oracle TopLink | |
******************************************************************************/ | |
package org.eclipse.persistence.tools.workbench.test.mappingsmodel.mapping; | |
import java.util.Collection; | |
import junit.framework.Test; | |
import junit.framework.TestSuite; | |
import org.eclipse.persistence.indirection.ValueHolderInterface; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.ProblemConstants; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWDatabase; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWReference; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWTable; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.InterfaceDescriptorCreationException; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWTableDescriptor; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWAbstractTableReferenceMapping; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWOneToManyMapping; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWOneToOneMapping; | |
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWRelationalDirectCollectionMapping; | |
import org.eclipse.persistence.tools.workbench.test.mappingsmodel.ModelProblemsTestCase; | |
import org.eclipse.persistence.tools.workbench.test.models.projects.CrimeSceneProject; | |
import org.eclipse.persistence.tools.workbench.utility.CollectionTools; | |
public class MWTableReferenceMappingTests extends ModelProblemsTestCase { | |
public static Test suite() { | |
return new TestSuite(MWTableReferenceMappingTests.class); | |
} | |
public MWTableReferenceMappingTests(String name) { | |
super(name); | |
} | |
public void testMWTableReferenceMapping() { | |
CrimeSceneProject crimeSceneProject = new CrimeSceneProject(); | |
MWAbstractTableReferenceMapping original = crimeSceneProject.getCrimeSceneMappingInPieceOfEvidence(); | |
assertCommonAttributesEqual(original, original.asMWManyToManyMapping()); | |
assertCommonAttributesEqual(original, original.asMWOneToManyMapping()); | |
assertCommonAttributesEqual(original, original.asMWOneToOneMapping()); | |
assertCommonAttributesEqual(original, (MWRelationalDirectCollectionMapping) original.asMWDirectCollectionMapping()); | |
} | |
public void testCandidateReferences() { | |
CrimeSceneProject crimeSceneProject = new CrimeSceneProject(); | |
MWAbstractTableReferenceMapping crimeSceneMappingInEvidence = crimeSceneProject.getCrimeSceneMappingInPieceOfEvidence(); | |
MWAbstractTableReferenceMapping evidenceMappingInCrimeScene = crimeSceneProject.getEvidenceMappingInCrimeScene(); | |
// add a reference from the crime scene table to the evidence table and make sure it | |
// doesn't show up in the 1-M candidate references. | |
MWTable crimeSceneTable = crimeSceneProject.getCrimeSceneDescriptor().getAssociatedTableNamed("CRIME_SCENE"); | |
MWTable evidenceTable = crimeSceneProject.getPieceOfEvidenceDescriptor().getAssociatedTableNamed("EVIDENCE"); | |
MWReference bogusRef = crimeSceneTable.addReference("BOGUS", evidenceTable); | |
bogusRef.addColumnPair(crimeSceneTable.columnNamed("DESCRIPTION"), evidenceTable.columnNamed("DESCRIPTION")); | |
Collection refsInEvidence = CollectionTools.collection(crimeSceneMappingInEvidence.candidateReferences()); | |
Collection refsInCrimeScene = CollectionTools.collection(evidenceMappingInCrimeScene.candidateReferences()); | |
assertTrue("Didn't get same references for 1-1 and 1-M between same classes.", refsInEvidence.containsAll(refsInCrimeScene)); | |
//Look at the comment in the getPossisbleReferences(). If that gets changed, then the following line should be un-commented | |
assertTrue("Should have more references for 1-1 than 1-M.", !(refsInCrimeScene.containsAll(refsInEvidence))); | |
} | |
public void testGetRelationshipPartnerMappingChoices() { | |
CrimeSceneProject crimeSceneProject = new CrimeSceneProject(); | |
MWOneToOneMapping oneToOneMapping = crimeSceneProject.getCrimeSceneMappingInPieceOfEvidence(); | |
assertEquals( | |
oneToOneMapping.getRelationshipPartnerMappingChoices(), | |
CollectionTools.collection(oneToOneMapping.getReferenceDescriptor().mappings()) | |
); | |
oneToOneMapping.setReferenceDescriptor(crimeSceneProject.getPieceOfEvidenceDescriptor()); | |
assertEquals( | |
oneToOneMapping.getRelationshipPartnerMappingChoices().size(), | |
CollectionTools.collection(oneToOneMapping.getReferenceDescriptor().mappings()).size() - 1 | |
); | |
assertFalse(oneToOneMapping.getRelationshipPartnerMappingChoices().contains(oneToOneMapping)); | |
} | |
public void testRemovedReference() { | |
CrimeSceneProject crimeSceneProject = new CrimeSceneProject(); | |
MWTable table = crimeSceneProject.getPieceOfEvidenceDescriptor().getPrimaryTable(); | |
MWReference reference = table.referenceNamed("EVIDENCE_CRIME_SCENE"); | |
MWAbstractTableReferenceMapping referenceMapping = crimeSceneProject.getCrimeSceneMappingInPieceOfEvidence(); | |
table.removeReference(reference); | |
assertTrue("The reference was not removed from the TableReferenceMapping",referenceMapping.getReference() == null); | |
} | |
public void testRemovedTable() { | |
CrimeSceneProject crimeSceneProject = new CrimeSceneProject(); | |
MWTable table = crimeSceneProject.getPieceOfEvidenceDescriptor().getPrimaryTable(); | |
MWDatabase database = table.getDatabase(); | |
MWAbstractTableReferenceMapping referenceMapping = crimeSceneProject.getCrimeSceneMappingInPieceOfEvidence(); | |
database.removeTable(table); | |
assertTrue("The reference was not removed from the TableReferenceMapping",referenceMapping.getReference() == null); | |
} | |
public void testMappingAndVariableDontUseIndirectionProblem() { | |
String problem = ProblemConstants.MAPPING_VALUE_HOLDER_ATTRIBUTE_WITHOUT_VALUE_HOLDER_INDIRECTION; | |
checkMappingsForFalseFailures(problem, MWAbstractTableReferenceMapping.class ); | |
checkMappingsForFalseFailures(problem, MWAbstractTableReferenceMapping.class ); | |
CrimeSceneProject csp = new CrimeSceneProject(); | |
MWOneToManyMapping oneToManyMapping = csp.getEvidenceMappingInCrimeScene(); | |
oneToManyMapping.getInstanceVariable().setType(csp.getProject().typeFor(ValueHolderInterface.class)); | |
assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, oneToManyMapping)); | |
MWOneToOneMapping one2oneMapping = csp.getCrimeSceneMappingInPieceOfEvidence(); | |
one2oneMapping.getInstanceVariable().setType(csp.getProject().typeFor(ValueHolderInterface.class)); | |
assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, one2oneMapping)); | |
} | |
public void testMappingAndVariableUseIndirectionProblem() { | |
String problem = ProblemConstants.MAPPING_VALUE_HOLDER_INDIRECTION_WITHOUT_VALUE_HOLDER_ATTRIBUTE; | |
checkMappingsForFalseFailures(problem, MWAbstractTableReferenceMapping.class ); | |
checkMappingsForFalseFailures(problem, MWAbstractTableReferenceMapping.class ); | |
CrimeSceneProject csp = new CrimeSceneProject(); | |
MWOneToManyMapping oneToManyMapping = csp.getEvidenceMappingInCrimeScene(); | |
oneToManyMapping.setUseValueHolderIndirection(); | |
assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, oneToManyMapping)); | |
MWOneToOneMapping one2oneMapping = csp.getCrimeSceneMappingInPieceOfEvidence(); | |
one2oneMapping.setUseValueHolderIndirection(); | |
assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, one2oneMapping)); | |
} | |
public void testMappingHasCorrectRelationshipPartnerIfBidirectionalRelationshipMaintainedProblem() { | |
String problem = ProblemConstants.MAPPING_RELATIONSHIP_PARTNER_NOT_SPECIFIED; | |
CrimeSceneProject csp = new CrimeSceneProject(); | |
MWOneToOneMapping mapping = csp.getCrimeSceneMappingInPieceOfEvidence(); | |
assertTrue("The mapping should not have the problem: " + problem, !hasProblem(problem, mapping)); | |
mapping.setMaintainsBidirectionalRelationship(true); | |
assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping)); | |
mapping.setRelationshipPartnerMapping(csp.getAddressMappingInCrimeScene()); | |
assertTrue("The mapping should have the problem: " + ProblemConstants.MAPPING_RELATIONSHIP_PARTNER_INVALID, hasProblem(ProblemConstants.MAPPING_RELATIONSHIP_PARTNER_INVALID, mapping)); | |
} | |
public void testReferenceNotNullProblem() { | |
// Verify that the mapping has a reference associated with it." | |
String errorName = ProblemConstants.MAPPING_TABLE_REFERENCE_NOT_SPECIFIED; | |
checkMappingsForFalseFailures( errorName, MWAbstractTableReferenceMapping.class ); | |
MWAbstractTableReferenceMapping mapping = (MWAbstractTableReferenceMapping) getMappingForClass(MWAbstractTableReferenceMapping.class, getCrimeSceneProject()); | |
MWReference oldReference = mapping.getReference(); | |
mapping.setReference(null); | |
assertTrue( "should have problem", hasProblem(errorName, mapping)); | |
// restore old values | |
mapping.setReference(oldReference); | |
assertTrue( "restored old values -- should not have problem", !hasProblem(errorName, mapping)); | |
} | |
public void testReferenceValidProblem() { | |
String problem = ProblemConstants.MAPPING_TABLE_REFERENCE_INVALID; | |
CrimeSceneProject csp = new CrimeSceneProject(); | |
MWOneToOneMapping mapping = csp.getCrimeSceneMappingInPieceOfEvidence(); | |
assertTrue("The mapping should not have the problem: " + problem, !hasProblem(problem, mapping)); | |
MWTable primaryTable = ((MWTableDescriptor) mapping.getParentRelationalDescriptor()).getPrimaryTable(); | |
mapping.getParentRelationalDescriptor().asMWAggregateDescriptor(); | |
assertTrue("The mapping within an aggregate descriptor should not have the problem: " + problem, !hasProblem(problem, mapping)); | |
try { | |
mapping.getParentRelationalDescriptor().asMWTableDescriptor(); | |
} catch (InterfaceDescriptorCreationException e) { | |
throw new RuntimeException(e); | |
} | |
((MWTableDescriptor) mapping.getParentRelationalDescriptor()).setPrimaryTable(primaryTable); | |
MWRelationalDirectCollectionMapping empMapping = (MWRelationalDirectCollectionMapping) csp.getCrimeSceneDescriptor().mappingNamed("keywords"); | |
mapping.setReference(empMapping.getReference()); | |
assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping)); | |
} | |
public void testRelationshipIsMutualProblem() { | |
String problem = ProblemConstants.MAPPING_RELATIONSHIP_PARTNER_NOT_MUTUAL; | |
CrimeSceneProject csp = new CrimeSceneProject(); | |
MWOneToManyMapping mapping = csp.getEvidenceMappingInCrimeScene(); | |
assertTrue("The mapping should not have the problem: " + problem, !hasProblem(problem, mapping)); | |
mapping.setMaintainsBidirectionalRelationship(true); | |
mapping.setRelationshipPartnerMapping(csp.getSuspectsMappingInCrimeScene()); | |
assertTrue("The mapping should have the problem: " + problem, hasProblem(problem, mapping)); | |
} | |
} |