Author: msahyoun Date: Mon Nov 16 15:19:21 2020 New Revision: 1883479 URL: http://svn.apache.org/viewvc?rev=1883479&view=rev Log: PDFBOX-5017: new class for schema testing derived from AbstractSchemaTester (which will be removed)
Added: pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/schema/SchemaTester.java Added: pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/schema/SchemaTester.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/schema/SchemaTester.java?rev=1883479&view=auto ============================================================================== --- pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/schema/SchemaTester.java (added) +++ pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/schema/SchemaTester.java Mon Nov 16 15:19:21 2020 @@ -0,0 +1,280 @@ +/***************************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.xmpbox.schema; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Random; + +import org.apache.xmpbox.XMPMetadata; +import org.apache.xmpbox.type.AbstractSimpleProperty; +import org.apache.xmpbox.type.ArrayProperty; +import org.apache.xmpbox.type.Cardinality; +import org.apache.xmpbox.type.TypeMapping; +import org.apache.xmpbox.type.AbstractTypeTester; +import org.apache.xmpbox.type.Types; + +class SchemaTester extends AbstractTypeTester { + + private XMPMetadata xmp; + + private XMPSchema xmpSchema; + + private String fieldName; + + private Types type; + + private Cardinality cardinality; + + private TypeMapping typeMapping;; + + private XMPSchema getSchema() { + return xmpSchema; + } + + private Class<? extends XMPSchema> getSchemaClass() { + return getSchema().getClass(); + } + + public SchemaTester(XMPMetadata xmp, XMPSchema schema, String fieldName, Types type, Cardinality card) + { + this.xmp = xmp; + this.xmpSchema = schema; + this.typeMapping = xmp.getTypeMapping(); + this.fieldName = fieldName; + this.type = type; + this.cardinality = card; + } + + public void testInitializedToNull() throws Exception + { + XMPSchema schema = getSchema(); + // default method + assertNull(schema.getProperty(fieldName)); + // accessor + if (cardinality == Cardinality.Simple) + { + String getter = calculateSimpleGetter(fieldName); + Method get = getSchemaClass().getMethod(getter); + Object result = get.invoke(schema); + assertNull(result); + } + else + { + // arrays + String getter = calculateArrayGetter(fieldName); + Method get = getSchemaClass().getMethod(getter); + Object result = get.invoke(schema); + assertNull(result); + } + + } + + public void testSettingValue() throws Exception + { + internalTestSettingValue(); + } + + public void testRandomSettingValue() throws Exception + { + initializeSeed(new Random()); + for (int i=0; i < RAND_LOOP_COUNT;i++) + { + internalTestSettingValue(); + } + } + + private void internalTestSettingValue() throws Exception + { + if (cardinality != Cardinality.Simple) + { + return; + } + XMPSchema schema = getSchema(); + // only test simple properties + Object value = getJavaValue(type); + AbstractSimpleProperty property = schema.instanciateSimple(fieldName, value); + schema.addProperty(property); + String qn = getPropertyQualifiedName(fieldName); + assertNotNull(schema.getProperty(fieldName)); + // check other properties not modified + List<Field> fields = getXmpFields(getSchemaClass()); + for (Field field : fields) + { + // do not check the current name + String fqn = getPropertyQualifiedName(field.get(null).toString()); + if (!fqn.equals(qn)) + { + assertNull(schema.getProperty(fqn)); + } + } + } + + public void testSettingValueInArray() throws Exception + { + internalTestSettingValueInArray(); + } + + public void testRandomSettingValueInArray() throws Exception + { + initializeSeed(new Random()); + for (int i=0; i < RAND_LOOP_COUNT;i++) + { + internalTestSettingValueInArray(); + } + } + + private void internalTestSettingValueInArray() throws Exception + { + if (cardinality == Cardinality.Simple) + { + return; + } + XMPSchema schema = getSchema(); + // only test array properties + Object value = getJavaValue(type); + AbstractSimpleProperty property = schema.instanciateSimple(fieldName, value); + switch (cardinality) + { + case Seq: + schema.addUnqualifiedSequenceValue(property.getPropertyName(), property); + break; + case Bag: + schema.addBagValue(property.getPropertyName(), property); + break; + default: + throw new Exception("Unexpected case in test : " + cardinality.name()); + } + String qn = getPropertyQualifiedName(fieldName); + assertNotNull(schema.getProperty(fieldName)); + // check other properties not modified + List<Field> fields = getXmpFields(getSchemaClass()); + for (Field field : fields) + { + // do not check the current name + String fqn = getPropertyQualifiedName(field.get(null).toString()); + if (!fqn.equals(qn)) + { + assertNull(schema.getProperty(fqn)); + } + } + } + + public void testPropertySetterSimple() throws Exception + { + internalTestPropertySetterSimple(); + } + + public void testRandomPropertySetterSimple() throws Exception + { + initializeSeed(new Random()); + for (int i=0; i < RAND_LOOP_COUNT;i++) + { + internalTestPropertySetterSimple(); + } + } + + private void internalTestPropertySetterSimple() throws Exception + { + if (cardinality != Cardinality.Simple) + { + return; + } + XMPSchema schema = getSchema(); + String setter = calculateSimpleSetter(fieldName) + "Property"; + Object value = getJavaValue(type); + AbstractSimpleProperty asp = typeMapping.instanciateSimpleProperty(schema.getNamespace(), schema + .getPrefix(), fieldName, value, type); + Method set = getSchemaClass().getMethod(setter, type.getImplementingClass()); + set.invoke(schema, asp); + // check property set + AbstractSimpleProperty stored = (AbstractSimpleProperty) schema.getProperty(fieldName); + assertEquals(value, stored.getValue()); + // check getter + String getter = calculateSimpleGetter(fieldName) + "Property"; + Method get = getSchemaClass().getMethod(getter); + Object result = get.invoke(schema); + assertTrue(type.getImplementingClass().isAssignableFrom(result.getClass())); + assertEquals(asp, result); + } + + public void testPropertySetterInArray() throws Exception + { + internalTestPropertySetterInArray(); + } + + public void testRandomPropertySetterInArray() throws Exception + { + initializeSeed(new Random()); + for (int i=0; i < RAND_LOOP_COUNT;i++) + { + internalTestPropertySetterInArray(); + } + } + + private void internalTestPropertySetterInArray() throws Exception + { + if (cardinality == Cardinality.Simple) + { + return; + } + XMPSchema schema = getSchema(); + // add value + String setter = "add" + calculateFieldNameForMethod(fieldName); + // TypeDescription<AbstractSimpleProperty> td = + // typeMapping.getSimpleDescription(type); + Object value1 = getJavaValue(type); + Method set = getSchemaClass().getMethod(setter, getJavaType(type)); + set.invoke(schema, value1); + // retrieve complex property + String getter = calculateArrayGetter(fieldName) + "Property"; + Method getcp = getSchemaClass().getMethod(getter); + Object ocp = getcp.invoke(schema); + assertTrue(ocp instanceof ArrayProperty); + ArrayProperty cp = (ArrayProperty) ocp; + // check size is ok (1) + assertEquals(1, cp.getContainer().getAllProperties().size()); + // add a new one + Object value2 = getJavaValue(type); + set.invoke(schema, value2); + assertEquals(2, cp.getContainer().getAllProperties().size()); + // remove the first + String remover = "remove" + calculateFieldNameForMethod(fieldName); + Method remove = getSchemaClass().getMethod(remover, getJavaType(type)); + remove.invoke(schema, value1); + assertEquals(1, cp.getContainer().getAllProperties().size()); + + } + + protected String getPropertyQualifiedName(String name) + { + StringBuilder sb = new StringBuilder(); + sb.append(getSchema().getPrefix()).append(":").append(name); + return sb.toString(); + } + +}