Added: pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/type/TestStructuredType.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/type/TestStructuredType.java?rev=1883462&view=auto ============================================================================== --- pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/type/TestStructuredType.java (added) +++ pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/type/TestStructuredType.java Sun Nov 15 23:22:35 2020 @@ -0,0 +1,196 @@ +/***************************************************************************** + * + * 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.type; + +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 java.util.stream.Stream; + +import org.apache.xmpbox.XMPMetadata; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class TestStructuredType extends AbstractTypeTester +{ + + @ParameterizedTest + @MethodSource("initializeParameters") + public void testInitializedToNull(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + assertNull(structured.getProperty(fieldName)); + // accessor + Method get = clz.getMethod(calculateSimpleGetter(fieldName)); + Object result = get.invoke(structured); + assertNull(result); + } + + @ParameterizedTest + @MethodSource("initializeParameters") + public void testSettingValue(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + internalTestSettingValue(structured, clz, fieldName, type); + } + + @ParameterizedTest + @MethodSource("initializeParameters") + public void testRandomSettingValue(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + initializeSeed(new Random()); + for (int i=0; i < RAND_LOOP_COUNT;i++) + { + internalTestSettingValue(structured, clz, fieldName, type); } + } + + private void internalTestSettingValue(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + Object value = getJavaValue(type); + structured.addSimpleProperty(fieldName, value); + assertNotNull(structured.getProperty(fieldName)); + // check other properties not modified + List<Field> fields = getXmpFields(clz); + for (Field field : fields) + { + // do not check the current name + String name = field.get(null).toString(); + if (!name.equals(fieldName)) + { + assertNull(structured.getProperty(name)); + } + } + } + + @ParameterizedTest + @MethodSource("initializeParameters") + public void testPropertyType(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + internalTestPropertyType(structured, clz, fieldName, type); + } + + @ParameterizedTest + @MethodSource("initializeParameters") + public void testRandomPropertyType(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + initializeSeed(new Random()); + for (int i=0; i < RAND_LOOP_COUNT;i++) + { + internalTestPropertyType(structured, clz, fieldName, type); + } + } + + + private void internalTestPropertyType(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + Object value = getJavaValue(type); + structured.addSimpleProperty(fieldName, value); + assertNotNull(structured.getProperty(fieldName)); + // check property type + AbstractSimpleProperty asp = (AbstractSimpleProperty) structured.getProperty(fieldName); + assertEquals(type.getImplementingClass(), asp.getClass()); + } + + + @ParameterizedTest + @MethodSource("initializeParameters") + public void testSetter(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + internalTestSetter(structured, clz, fieldName, type); + } + + @ParameterizedTest + @MethodSource("initializeParameters") + public void testRandomSetter(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + initializeSeed(new Random()); + for (int i=0; i < RAND_LOOP_COUNT;i++) + { + internalTestSetter(structured, clz, fieldName, type); + } + } + + private void internalTestSetter(AbstractStructuredType structured, Class<? extends AbstractStructuredType> clz, String fieldName, Types type) throws Exception + { + String setter = calculateSimpleSetter(fieldName); + Object value = getJavaValue(type); + Method set = clz.getMethod(setter, getJavaType(type)); + set.invoke(structured, value); + // check property set + assertEquals(value, ((AbstractSimpleProperty) structured.getProperty(fieldName)).getValue()); + // check getter + Method get = clz.getMethod(calculateSimpleGetter(fieldName)); + Object result = get.invoke(structured); + assertTrue(getJavaType(type).isAssignableFrom(result.getClass())); + assertEquals(value, result); + } + + private static Stream<Arguments> initializeParameters() + { + XMPMetadata xmp = XMPMetadata.createXMPMetadata(); + + return Stream.of( + // data for JobType + Arguments.of(new JobType(xmp, "job"), JobType.class, "id", Types.Text), + Arguments.of(new JobType(xmp, "job"), JobType.class, "name", Types.Text), + Arguments.of(new JobType(xmp, "job"), JobType.class, "url", Types.URL), + // data for LayerType + Arguments.of(new LayerType(xmp), LayerType.class, "LayerName", Types.Text), + Arguments.of(new LayerType(xmp), LayerType.class, "LayerText", Types.Text), + // data for ResourceEventType + Arguments.of(new ResourceEventType(xmp), ResourceEventType.class, "action", Types.Choice), + Arguments.of(new ResourceEventType(xmp), ResourceEventType.class, "changed", Types.Text), + Arguments.of(new ResourceEventType(xmp), ResourceEventType.class, "instanceID", Types.GUID), + Arguments.of(new ResourceEventType(xmp), ResourceEventType.class, "parameters", Types.Text), + Arguments.of(new ResourceEventType(xmp), ResourceEventType.class, "softwareAgent", Types.AgentName), + Arguments.of(new ResourceEventType(xmp), ResourceEventType.class, "when", Types.Date), + // data for ResourceEventType + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "documentID", Types.URI), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "filePath", Types.URI), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "fromPart", Types.Part), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "instanceID", Types.URI), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "lastModifyDate", Types.Date), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "manager", Types.AgentName), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "managerVariant", Types.Text), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "manageTo", Types.URI), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "manageUI", Types.URI), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "maskMarkers", Types.Choice), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "partMapping", Types.Text), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "renditionClass", Types.RenditionClass), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "renditionParams", Types.Text), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "toPart", Types.Part), + Arguments.of(new ResourceRefType(xmp), ResourceRefType.class, "versionID", Types.Text), + // data for ThumbnailType + Arguments.of(new ThumbnailType(xmp), ThumbnailType.class, "format", Types.Choice), + Arguments.of(new ThumbnailType(xmp), ThumbnailType.class, "height", Types.Integer), + Arguments.of(new ThumbnailType(xmp), ThumbnailType.class, "width", Types.Integer), + Arguments.of(new ThumbnailType(xmp), ThumbnailType.class, "image", Types.Text), + // data for VersionType + Arguments.of(new VersionType(xmp), VersionType.class, "modifier", Types.ProperName) + ); + } +}