diff --git a/tdt4250.facebook.tests/META-INF/MANIFEST.MF b/tdt4250.facebook.tests/META-INF/MANIFEST.MF index c691f9b1814b3e8ff7236c44017a067193a9c862..13819864eee92f3f02c20a76eb56a286f4f0382a 100644 --- a/tdt4250.facebook.tests/META-INF/MANIFEST.MF +++ b/tdt4250.facebook.tests/META-INF/MANIFEST.MF @@ -12,5 +12,7 @@ Export-Package: tdt4250.fb.tests Require-Bundle: org.eclipse.core.runtime, tdt4250.facebook;visibility:=reexport, org.eclipse.emf.ecore.xmi;visibility:=reexport, - org.junit;visibility:=reexport + org.junit;visibility:=reexport, + org.eclipse.acceleo.query;bundle-version="7.0.0", + org.antlr.runtime;bundle-version="4.7.2" Bundle-ActivationPolicy: lazy diff --git a/tdt4250.facebook.tests/src/tdt4250/fb/tests/FbValidatorTest.java b/tdt4250.facebook.tests/src/tdt4250/fb/tests/FbValidatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a6059138e1d68339b5d93edf5a3c40483bb1a0ec --- /dev/null +++ b/tdt4250.facebook.tests/src/tdt4250/fb/tests/FbValidatorTest.java @@ -0,0 +1,96 @@ +package tdt4250.fb.tests; + +import java.util.List; + +import org.eclipse.acceleo.query.delegates.AQLValidationDelegate; +import org.eclipse.emf.common.util.Diagnostic; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EValidator.ValidationDelegate; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.util.Diagnostician; + +import junit.framework.TestCase; +import tdt4250.fb.Facebook; +import tdt4250.fb.FbFactory; +import tdt4250.fb.FbPackage; +import tdt4250.fb.Like; +import tdt4250.fb.Post; +import tdt4250.fb.Share; +import tdt4250.fb.User; +import tdt4250.fb.util.FbResourceFactoryImpl; + +public class FbValidatorTest extends TestCase { + +// private Resource testInstance; +// private Diagnostic diagnostics; + + protected Resource loadFbResource(String name) { + // A container of Resource, whether loaded explicitly or on-demand (automatically) + ResourceSet resSet = new ResourceSetImpl(); + // relate the FbPackage identifier used in XMI files to the FbPackage instance (EPackage meta-object) + resSet.getPackageRegistry().put(FbPackage.eNS_URI, FbPackage.eINSTANCE); + // map the 'fb' file extension to our custom Resource.Factory implementation + resSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("fb", new FbResourceFactoryImpl()); + + return resSet.getResource(URI.createURI(FbValidatorTest.class.getResource(name + ".fb").toString()), true); + } + + protected void setUp() throws Exception { + // register AQL (an OCL implementation) constraint support, so we can test OCL constraints, too + ValidationDelegate.Registry.INSTANCE.put("http://www.eclipse.org/acceleo/query/1.0", new AQLValidationDelegate()); + } + + public void testConstraint_userNotAuthor1() { + // create post with a like from other user + User user1 = FbFactory.eINSTANCE.createUser(); + User user2 = FbFactory.eINSTANCE.createUser(); + Post post = FbFactory.eINSTANCE.createPost(); + post.setAuthor(user1); + Like like = FbFactory.eINSTANCE.createLike(); + post.getLikes().add(like); + like.setUser(user2); + // run validation and check result + Diagnostic diagnostics = Diagnostician.INSTANCE.validate(like); + assertTrue(diagnostics.getSeverity() == Diagnostic.OK); + // make like user and post author the same + like.setUser(user1); + // re-run validation and check result + diagnostics = Diagnostician.INSTANCE.validate(like); + assertTrue(diagnostics.getSeverity() == Diagnostic.ERROR); + } + + // test constraints with instances loaded from pre-made resource + public void testConstraint_userNotAuthor2() { + // load test resource + Resource resource = loadFbResource("testConstraint_userNotAuthor2"); + // navigate to likes + List<Like> likes = ((Facebook) resource.getContents().get(0)).getUsers().get(1).getPosts().get(0).getLikes(); + // run validation one first like and check result + Diagnostic diagnostics = Diagnostician.INSTANCE.validate(likes.get(0)); + assertTrue(diagnostics.getSeverity() == Diagnostic.OK); + // run validation one second like and check result + diagnostics = Diagnostician.INSTANCE.validate(likes.get(1)); + assertTrue(diagnostics.getSeverity() == Diagnostic.ERROR); + } + + public void testConstraint_shareAuthorNotPostAuthor1() { + // create post and share with different authors + User user1 = FbFactory.eINSTANCE.createUser(); + User user2 = FbFactory.eINSTANCE.createUser(); + Post post = FbFactory.eINSTANCE.createPost(); + post.setAuthor(user1); + Share share = FbFactory.eINSTANCE.createShare(); + share.setOriginal(post); + share.setAuthor(user2); + // run validation and check result + Diagnostic diagnostics = Diagnostician.INSTANCE.validate(share); + assertTrue(diagnostics.getSeverity() == Diagnostic.OK); + // make authors the same + share.setAuthor(user1); + // re-run validation and check result + diagnostics = Diagnostician.INSTANCE.validate(share); + assertTrue(diagnostics.getSeverity() == Diagnostic.ERROR); + } +} diff --git a/tdt4250.facebook.tests/src/tdt4250/fb/tests/testConstraint_userNotAuthor2.fb b/tdt4250.facebook.tests/src/tdt4250/fb/tests/testConstraint_userNotAuthor2.fb new file mode 100644 index 0000000000000000000000000000000000000000..eed967d03b34746c41f13729c246e3a784f9dcfe --- /dev/null +++ b/tdt4250.facebook.tests/src/tdt4250/fb/tests/testConstraint_userNotAuthor2.fb @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<fb:Facebook + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:fb="platform:/plugin/tdt4250.facebook/model/fb.ecore" + > + <users givenName="Hallvard" + familyName="Trætteberg"/> + <users givenName="Steinar" + familyName="Lien"> + <posts author="//@users.1"> + <likes + user="//@users.0"/> + <likes + user="//@users.1"/> + <body + contents=""/> + </posts> + </users> +</fb:Facebook> diff --git a/tdt4250.facebook/model/Facebook.xmi b/tdt4250.facebook/model/Facebook.xmi index 85414776da8e20a690f756fceac592078cfbe982..ec23062692cfc36d3a46d8f08935449b3163b3c6 100644 --- a/tdt4250.facebook/model/Facebook.xmi +++ b/tdt4250.facebook/model/Facebook.xmi @@ -14,19 +14,19 @@ <users givenName="Steinar" familyName="Lien"> <posts author="//@users.1"> - <body - contents="Topp tur med gubbeklubben Ulenth!
Ryggjehø, Nautgardsoksle, Nautgardstinden, Austre Nautgardstinden og Stornubben. Og gitarspill, sang, øl, vin, mat (bl.a. Bessheims berømte viltbuffet!) og meninger. Sterke meninger...."/> <likes user="//@users.2"/> + <body + contents="Topp tur med gubbeklubben Ulenth!
Ryggjehø, Nautgardsoksle, Nautgardstinden, Austre Nautgardstinden og Stornubben. Og gitarspill, sang, øl, vin, mat (bl.a. Bessheims berømte viltbuffet!) og meninger. Sterke meninger...."/> <comments author="//@users.2"> <body contents="Men hvor er "broren "da ??"/> - <reply + <replies author="//@users.1"> <body contents="Han var ikke tilstede da disse bildene ble tatt!"/> - </reply> + </replies> </comments> <comments author="//@users.3"> diff --git a/tdt4250.facebook/model/fb.ecore b/tdt4250.facebook/model/fb.ecore index a6aac1c9699444421e7ae44f29ea42fa6d620ac3..c6ca112c491ed94845485b125d77588e84218ded 100644 --- a/tdt4250.facebook/model/fb.ecore +++ b/tdt4250.facebook/model/fb.ecore @@ -28,13 +28,13 @@ <eStructuralFeatures xsi:type="ecore:EAttribute" name="timestamp" eType="#//ELocalDateTime"/> </eClassifiers> <eClassifiers xsi:type="ecore:EClass" name="Post" eSuperTypes="#//AbstractContent"> - <eStructuralFeatures xsi:type="ecore:EReference" name="body" eType="#//PostBody" + <eStructuralFeatures xsi:type="ecore:EReference" name="body" lowerBound="1" eType="#//PostBody" containment="true"/> <eStructuralFeatures xsi:type="ecore:EReference" name="comments" upperBound="-1" eType="#//Comment" containment="true"/> </eClassifiers> <eClassifiers xsi:type="ecore:EClass" name="Comment" eSuperTypes="#//AbstractContent"> - <eStructuralFeatures xsi:type="ecore:EReference" name="body" eType="#//CommentBody" + <eStructuralFeatures xsi:type="ecore:EReference" name="body" lowerBound="1" eType="#//CommentBody" containment="true"/> <eStructuralFeatures xsi:type="ecore:EReference" name="replies" upperBound="-1" eType="#//Comment" containment="true"/> diff --git a/tdt4250.facebook/model/fb.genmodel b/tdt4250.facebook/model/fb.genmodel index 33887b0f297d5ca6d0ecbe3d9e4761f899df810c..592b501780feeefcfd914652657e72ed283a9768 100644 --- a/tdt4250.facebook/model/fb.genmodel +++ b/tdt4250.facebook/model/fb.genmodel @@ -10,7 +10,11 @@ <genEnums typeSafeEnumCompatible="false" ecoreEnum="fb.ecore#//LikeKind"> <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/like"/> <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/heart"/> - <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/compasion"/> + <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/compassion"/> + <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/funny"/> + <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/wow"/> + <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/sad"/> + <genEnumLiterals ecoreEnumLiteral="fb.ecore#//LikeKind/angry"/> </genEnums> <genDataTypes ecoreDataType="fb.ecore#//ELocalDateTime"/> <genDataTypes ecoreDataType="fb.ecore#//ELocalDate"/> diff --git a/tdt4250.facebook/src/tdt4250/fb/impl/AbstractContentImpl.java b/tdt4250.facebook/src/tdt4250/fb/impl/AbstractContentImpl.java index 2154b0838cfd0dffb20c79dced797628e99ebcff..e1ad5fad62301def8ce9e238ba346e643c6f9946 100644 --- a/tdt4250.facebook/src/tdt4250/fb/impl/AbstractContentImpl.java +++ b/tdt4250.facebook/src/tdt4250/fb/impl/AbstractContentImpl.java @@ -84,7 +84,7 @@ public abstract class AbstractContentImpl extends MinimalEObjectImpl.Container i /** * <!-- begin-user-doc --> * <!-- end-user-doc --> - * @generated + * @generated NOT */ protected AbstractContentImpl() { super(); diff --git a/tdt4250.facebook/src/tdt4250/fb/impl/FbFactoryImpl.java b/tdt4250.facebook/src/tdt4250/fb/impl/FbFactoryImpl.java index 31042e3c3be3a3060e1eace3cd9364ddcbc8a247..abc7d3840fbfad4c151ff1a22bcb4e6f39c94f86 100644 --- a/tdt4250.facebook/src/tdt4250/fb/impl/FbFactoryImpl.java +++ b/tdt4250.facebook/src/tdt4250/fb/impl/FbFactoryImpl.java @@ -143,7 +143,7 @@ public class FbFactoryImpl extends EFactoryImpl implements FbFactory { /** * <!-- begin-user-doc --> * <!-- end-user-doc --> - * @generated + * @generated NOT */ public Post createPost() { PostImpl post = new PostImpl();