Package org.fcrepo.client.utility.validate.types

Source Code of org.fcrepo.client.utility.validate.types.TestDsCompositeModelDoc$ExpectedForm

/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/

package org.fcrepo.client.utility.validate.types;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.junit.Test;

import org.fcrepo.client.utility.validate.InvalidContentModelException;
import org.fcrepo.client.utility.validate.types.ContentModelInfo;
import org.fcrepo.client.utility.validate.types.DsCompositeModelDoc;
import org.fcrepo.client.utility.validate.types.DsCompositeModelDoc.DsTypeModel;


import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;

/**
* @author Jim Blake
*/
public class TestDsCompositeModelDoc {

    public static final String TYPICAL_MODEL =
            "<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
                    + "   <dsTypeModel ID=\"DC\">\n"
                    + "       <form MIME=\"text/xml\">\n"
                    + "       </form>\n"
                    + "   </dsTypeModel>\n"
                    + "   <dsTypeModel ID=\"RELS-EXT\">\n"
                    + "       <form MIME=\"application/rdf+xml\">\n"
                    + "       </form>\n"
                    + "   </dsTypeModel>\n"
                    + "   <dsTypeModel ID=\"XML_SOURCE\">\n"
                    + "       <form MIME=\"text/xml\">\n"
                    + "       </form>\n"
                    + "   </dsTypeModel>\n"
                    + "   <dsTypeModel ID=\"XSL_STYLESHEET1\">\n"
                    + "       <form MIME=\"text/xml\">\n"
                    + "       </form>\n"
                    + "   </dsTypeModel>\n"
                    + "   <dsTypeModel ID=\"XSL_STYLESHEET2\">\n"
                    + "       <form MIME=\"text/xml\">\n"
                    + "       </form>\n"
                    + "   </dsTypeModel>\n" + "</dsCompositeModel>";

    public static final ExpectedTypeModel[] TYPICAL_RESULTS =
            new ExpectedTypeModel[] {
                    new ExpectedTypeModel("DC",
                                          new ExpectedForm[] {new ExpectedForm("text/xml",
                                                                               null)}),
                    new ExpectedTypeModel("RELS-EXT",
                                          new ExpectedForm[] {new ExpectedForm("application/rdf+xml",
                                                                               null)}),
                    new ExpectedTypeModel("XML_SOURCE",
                                          new ExpectedForm[] {new ExpectedForm("text/xml",
                                                                               null)}),
                    new ExpectedTypeModel("XSL_STYLESHEET1",
                                          new ExpectedForm[] {new ExpectedForm("text/xml",
                                                                               null)}),
                    new ExpectedTypeModel("XSL_STYLESHEET2",
                                          new ExpectedForm[] {new ExpectedForm("text/xml",
                                                                               null)}),};

    public static final String ASSORTED_FORMS =
            "<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
                    + "   <dsTypeModel ID=\"NoForms\">\n"
                    + "   </dsTypeModel>\n"
                    + "   <dsTypeModel ID=\"MultipleForms\">\n"
                    + "       <form MIME=\"application/rdf+xml\" FORMAT_URI=\"someUri\"/>\n"
                    + "       <form MIME=\"text/xml\"/>\n"
                    + "       <form FORMAT_URI=\"otherUri\"/>\n"
                    + "       <form/>\n"
                    + "   </dsTypeModel>\n"
                    + "</dsCompositeModel>";

    public static final ExpectedTypeModel[] ASSORTED_RESULTS =
            new ExpectedTypeModel[] {
                    new ExpectedTypeModel("MultipleForms", new ExpectedForm[] {
                            new ExpectedForm("application/rdf+xml", "someUri"),
                            new ExpectedForm("text/xml", null),
                            new ExpectedForm(null, "otherUri"),
                            new ExpectedForm(null, null)}),
                    new ExpectedTypeModel("NoForms", new ExpectedForm[] {})};

    public static final String EMPTY_MODEL =
            "<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
                    + "</dsCompositeModel>";

    public static final ExpectedTypeModel[] EMPTY_RESULTS =
            new ExpectedTypeModel[0];

    public static final String BROKEN_TYPE_MODEL =
            "<dsCompositeModel xmlns=\"info:fedora/fedora-system:def/dsCompositeModel#\">\n"
                    + "   <dsTypeModel >\n"
                    + "   </dsTypeModel>\n"
                    + "</dsCompositeModel>";

    @Test
    public void typicalModel() throws InvalidContentModelException {
        DsCompositeModelDoc doc =
                new DsCompositeModelDoc("junkPid", TYPICAL_MODEL.getBytes());
        DsTypeModel[] actualModels = getSortedTypeModelsArray(doc);
        assertExpectedResults(TYPICAL_RESULTS, actualModels);
    }

    @Test
    public void assortedForms() throws InvalidContentModelException {
        DsCompositeModelDoc doc =
                new DsCompositeModelDoc("junkPid", ASSORTED_FORMS.getBytes());
        DsTypeModel[] actualModels = getSortedTypeModelsArray(doc);
        assertExpectedResults(ASSORTED_RESULTS, actualModels);
    }

    @Test
    public void emptyModel() throws InvalidContentModelException {
        DsCompositeModelDoc doc =
                new DsCompositeModelDoc("junkPid", EMPTY_MODEL.getBytes());
        DsTypeModel[] actualModels = getSortedTypeModelsArray(doc);
        assertExpectedResults(EMPTY_RESULTS, actualModels);
    }

    @Test(expected = InvalidContentModelException.class)
    public void typeModelHasNoId() throws InvalidContentModelException {
        new DsCompositeModelDoc("junkPid", BROKEN_TYPE_MODEL.getBytes());
    }

    private void assertExpectedResults(ExpectedTypeModel[] expectedModels,
                                       DsTypeModel[] actualModels) {
        assertEquals("number of models",
                     expectedModels.length,
                     actualModels.length);
        for (int i = 0; i < actualModels.length; i++) {
            DsTypeModel actualModel = actualModels[i];
            String actualId = actualModel.getId();
            assertEquals("id", expectedModels[i].id, actualId);
            assertEqualForms(actualId, expectedModels[i].forms, actualModel
                    .getForms());
        }
    }

    // No type models
    // No forms in a type model
    // Multiple forms in a type model
    // Form with neither Mime nor FormatUri
    // Form with either or both Mime or FormatUri

    private DsTypeModel[] getSortedTypeModelsArray(DsCompositeModelDoc doc) {
        Set<ContentModelInfo.DsTypeModel> tmSet = doc.getTypeModels();
        DsTypeModel[] result = tmSet.toArray(new DsTypeModel[tmSet.size()]);
        Arrays.sort(result, new Comparator<DsTypeModel>() {

            public int compare(DsTypeModel obj1, DsTypeModel obj2) {
                return obj1.getId().compareTo(obj2.getId());
            }
        });
        return result;
    }

    private void assertEqualForms(String dsId,
                                  ExpectedForm[] expected,
                                  Set<ContentModelInfo.Form> actual) {
        Set<ContentModelInfo.Form> extras =
                new HashSet<ContentModelInfo.Form>(actual);
        Set<ExpectedForm> missing = new HashSet<ExpectedForm>();

        outer: for (int i = 0; i < expected.length; i++) {
            ExpectedForm expectedForm = expected[i];
            for (Iterator<ContentModelInfo.Form> actuals = extras.iterator(); actuals
                    .hasNext();) {
                ContentModelInfo.Form actualForm = actuals.next();
                if (equivalent(expectedForm.mime, actualForm.getMimeType())
                        && equivalent(expectedForm.formatUri, actualForm
                                .getFormatUri())) {
                    actuals.remove();
                    continue outer;
                }
            }
            missing.add(expectedForm);
        }
        assertTrue("dsId: " + dsId + ", unexpected forms: " + extras
                + "\nmissing forms: " + missing, missing.isEmpty()
                && extras.isEmpty());
    }

    private boolean equivalent(Object obj1, Object obj2) {
        return (obj1 == null) ? obj2 == null : obj1.equals(obj2);
    }

    private static class ExpectedTypeModel {

        public final String id;

        public final ExpectedForm[] forms;

        public ExpectedTypeModel(String id, ExpectedForm[] forms) {
            this.id = id;
            this.forms = forms;
        }

    }

    private static class ExpectedForm {

        public final String mime;

        public final String formatUri;

        public ExpectedForm(String mime, String formatUri) {
            this.mime = mime;
            this.formatUri = formatUri;
        }

        @Override
        public String toString() {
            return "ExpectedForm[mime=" + mime + ", formatUri=" + formatUri
                    + "]";
        }

    }
}
TOP

Related Classes of org.fcrepo.client.utility.validate.types.TestDsCompositeModelDoc$ExpectedForm

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.