Change 'type empty' mapping 49/80949/13
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 18 Mar 2019 13:40:29 +0000 (14:40 +0100)
committerJie Han <han.jie@zte.com.cn>
Wed, 20 Mar 2019 06:24:33 +0000 (06:24 +0000)
This patch changes 'type empty' leaves to map to yang.common.Empty,
aligning DOM and Binding representations and removing potential
confusion around what Boolean.FALSE means in the value.

It also eliminates the need for a dedicated codec, as this type is
handled through NOOP_CODEC.

JIRA: MDSAL-48
Change-Id: If43d710d4620cffaecc8ca7d42d1eb00c58370c0
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
14 files changed:
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/EmptyLeafTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/TypedefTest.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypes.java
binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypesTest.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Constants.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/TypedefCompilationTest.java

index 4a5083f636f603557d47dc21b2385138936f50e3..84ab3e539a4bc45cbadcb8a6e05981a07e9f041e 100644 (file)
@@ -56,7 +56,6 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
@@ -283,10 +282,6 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
             @SuppressWarnings({ "unchecked", "rawtypes" })
             final Codec<Object, Object> casted = (Codec) instanceIdentifierCodec;
             return casted;
-        } else if (Boolean.class.equals(valueType)) {
-            if (instantiatedType instanceof EmptyTypeDefinition) {
-                return ValueTypeCodec.EMPTY_CODEC;
-            }
         } else if (BindingReflections.isBindingClass(valueType)) {
             return getCodecForBindingClass(valueType, instantiatedType);
         }
index 5e9f21e89e38bbb1880fef136d46fdd0009d78ca..3452e2ac65bd1fe575da2b0f16feca4092f35e1b 100644 (file)
@@ -19,7 +19,6 @@ import java.util.concurrent.Callable;
 import org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 
 /**
  * Derived YANG types are just immutable value holders for simple value
@@ -43,7 +42,7 @@ final class EncapsulatedValueCodec extends ReflectionBasedCodec implements Schem
     static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz, final TypeDefinition<?> typeDef) {
         return () -> {
             final Method m;
-            if (typeDef instanceof BooleanTypeDefinition || typeDef instanceof EmptyTypeDefinition) {
+            if (typeDef instanceof BooleanTypeDefinition) {
                 m = typeClz.getMethod("isValue");
             } else {
                 m = typeClz.getMethod("getValue");
index 2b8b69d08ece0d2c1a2d6f7469516b30fa006d7f..7cf9733607674d4643ea9253d97e64041dfd224b 100644 (file)
@@ -13,10 +13,8 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.concepts.Codec;
-import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 
 /**
@@ -37,7 +35,7 @@ abstract class ValueTypeCodec implements Codec<Object, Object> {
 
     /**
      * No-op Codec, Java YANG Binding uses same types as NormalizedNode model for base YANG types, representing numbers,
-     * binary and strings.
+     * binary, strings and empty.
      */
     public static final SchemaUnawareCodec NOOP_CODEC = new SchemaUnawareCodec() {
 
@@ -52,31 +50,11 @@ abstract class ValueTypeCodec implements Codec<Object, Object> {
         }
     };
 
-    public static final SchemaUnawareCodec EMPTY_CODEC = new SchemaUnawareCodec() {
-
-        @Override
-        public Object serialize(final Object input) {
-            // Empty type has Empty value in NormalizedNode and Composite Node representation
-            return Empty.getInstance();
-        }
-
-        @Override
-        public Object deserialize(final Object input) {
-            /* Empty type has boolean.TRUE representation in Binding-aware world otherwise it is null / false.
-             * So when codec is triggered, empty leaf is present, that means we are safe to return true.
-             */
-            return Boolean.TRUE;
-        }
-    };
-
-    private static final Callable<? extends SchemaUnawareCodec> EMPTY_LOADER = () -> EMPTY_CODEC;
-
-
     public static SchemaUnawareCodec getCodecFor(final Class<?> typeClz, final TypeDefinition<?> def) {
         if (BindingReflections.isBindingClass(typeClz)) {
             return getCachedSchemaUnawareCodec(typeClz, getCodecLoader(typeClz, def));
         }
-        return def instanceof EmptyTypeDefinition ? EMPTY_CODEC : NOOP_CODEC;
+        return NOOP_CODEC;
     }
 
     private static SchemaUnawareCodec getCachedSchemaUnawareCodec(final Class<?> typeClz,
index c82825e094e4faedd919b4a6dd3f38d736f977f5..7349ccdd2d680cbe778fc37de6e7181a71e15f07 100644 (file)
@@ -12,7 +12,6 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 
 public final class BindingSchemaMapping {
     private BindingSchemaMapping() {
@@ -25,11 +24,11 @@ public final class BindingSchemaMapping {
     }
 
     public static String getGetterMethodName(final TypedDataSchemaNode node) {
-        // Bug 8903: If it is a derived type of boolean or empty, not an inner type, then the return type
+        // Bug 8903: If it is a derived type of boolean, not an inner type, then the return type
         // of method would be the generated type of typedef not build-in types, so here it should be 'get'.
         final TypeDefinition<?> type = node.getType();
         return BindingMapping.getGetterMethodName(node.getQName(),
-            (type instanceof BooleanTypeDefinition || type instanceof EmptyTypeDefinition)
+            type instanceof BooleanTypeDefinition
             && (type.getPath().equals(node.getPath()) || type.getBaseType() == null));
     }
 }
index 4332a3a5a937c7b0817520b888c312d0233083d2..794659b176edb6b937502202f5307dbf1c2e5191 100644 (file)
@@ -25,16 +25,16 @@ public class UnionValueOptionContextTest {
         final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
         final Method methodFoo2 = TestDataObject2.class.getMethod("foo");
         TEST_UVOC_1 = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class, methodFoo1,
-            ValueTypeCodec.EMPTY_CODEC);
+            ValueTypeCodec.NOOP_CODEC);
         TEST_UVOC_2 = new UnionValueOptionContext(TestUnion.class, TestDataObject2.class, methodFoo2,
-            ValueTypeCodec.EMPTY_CODEC);
+            ValueTypeCodec.NOOP_CODEC);
     }
 
     @Test
     public void hashCodeTest() throws Exception {
         final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
         final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
-            methodFoo1, ValueTypeCodec.EMPTY_CODEC);
+            methodFoo1, ValueTypeCodec.NOOP_CODEC);
 
         assertEquals("HashCode", test_uvoc.hashCode(), TEST_UVOC_1.hashCode());
         assertNotEquals("HashCode", TEST_UVOC_1.hashCode(), TEST_UVOC_2.hashCode());
@@ -44,7 +44,7 @@ public class UnionValueOptionContextTest {
     public void equalsTest() throws Exception {
         final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
         final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
-            methodFoo1, ValueTypeCodec.EMPTY_CODEC);
+            methodFoo1, ValueTypeCodec.NOOP_CODEC);
 
         assertTrue("Equals", TEST_UVOC_1.equals(test_uvoc));
         assertFalse("Not equals", TEST_UVOC_1.equals(TEST_UVOC_2));
index 1604858975bebb89e21a36275471ca1503f49b19..6450a29c9f1d05382fc5720f74c53457ce9b9f64 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.test;
 
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Collections;
@@ -26,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.ChoiceInList;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -45,7 +47,7 @@ public class EmptyLeafTest extends AbstractBindingCodecTest {
     public void testCaseWithEmptyLeafType() {
         final TopLevelList withEmptyCase = new TopLevelListBuilder()
             .withKey(TOP_FOO_KEY)
-            .setChoiceInList(new EmptyLeafBuilder().setEmptyType(true).build())
+            .setChoiceInList(new EmptyLeafBuilder().setEmptyType(Empty.getInstance()).build())
             .build();
         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom = registry.toNormalizedNode(BA_TOP_LEVEL_LIST,
             withEmptyCase);
@@ -53,7 +55,7 @@ public class EmptyLeafTest extends AbstractBindingCodecTest {
             dom.getValue());
         final ChoiceInList list = ((TopLevelList) readed.getValue()).getChoiceInList();
         assertTrue(list instanceof EmptyLeaf);
-        assertTrue(((EmptyLeaf) list).isEmptyType());
+        assertNotNull(((EmptyLeaf) list).getEmptyType());
     }
 
     private static RpcComplexUsesAugment createComplexData() {
index 1fa38c283b6fe83be621046d93b0d4507d7b4131..eb0910c52a4fbc0e8d6c1b8cc5d4de77aef6a55d 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.typedef.empty.rev170829.TypedefEmpty;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
@@ -49,9 +50,9 @@ public class TypedefTest extends AbstractBindingCodecTest {
     @Test
     public void testTypedefEmptyType() {
         TestCont binding = new TestContBuilder()
-                .setEmptyLeaf(true)
-                .setEmptyLeaf2(new TypedefEmpty(true))
-                .setEmptyLeaf3(true)
+                .setEmptyLeaf(Empty.getInstance())
+                .setEmptyLeaf2(new TypedefEmpty(Empty.getInstance()))
+                .setEmptyLeaf3(Empty.getInstance())
                 .build();
         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom =
                 registry.toNormalizedNode(BA_TEST_CONT, binding);
index 2863b462f1f311b18120cd71011931fa74424741..2f3d7a23e544ab7ee8673d01d21464f524d2504a 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.util.Types;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
@@ -32,7 +33,7 @@ public final class BaseYangTypes {
     /**
      * <code>Type</code> representation of <code>empty</code> YANG type.
      */
-    public static final Type EMPTY_TYPE = BOOLEAN_TYPE;
+    public static final Type EMPTY_TYPE = Types.typeForClass(Empty.class);
 
     public static final Type ENUM_TYPE = Types.typeForClass(Enum.class);
 
index 2631d500ff119c693b99fba4512db74b10ce228d..066d07392fcdb9d4c3a8fe6432dc5d1aa5ca60fc 100644 (file)
@@ -19,6 +19,7 @@ import org.junit.Test;
 import org.opendaylight.mdsal.binding.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
@@ -185,7 +186,7 @@ public class BaseYangTypesTest {
 
         javaType = typeProvider.javaTypeForSchemaDefinitionType(empty, empty);
         assertNotNull(javaType);
-        assertEquals(Boolean.class.getCanonicalName(), javaType.getFullyQualifiedName());
+        assertEquals(Empty.class.getCanonicalName(), javaType.getFullyQualifiedName());
 
         javaType = typeProvider.javaTypeForSchemaDefinitionType(bool, bool);
         assertNotNull(javaType);
@@ -263,7 +264,7 @@ public class BaseYangTypesTest {
         javaType = typeProvider.javaTypeForSchemaDefinitionType(empty, empty,
             BindingGeneratorUtil.getRestrictions(empty));
         assertNotNull(javaType);
-        assertEquals(Boolean.class.getCanonicalName(), javaType.getFullyQualifiedName());
+        assertEquals(Empty.class.getCanonicalName(), javaType.getFullyQualifiedName());
 
         javaType = typeProvider.javaTypeForSchemaDefinitionType(bool, bool,
             BindingGeneratorUtil.getRestrictions(bool));
index 337c7a7c8801e25f4dd90103d9fdda3daa10c87d..24f2972c625635ec1a53b900295f63cbd4821eeb 100644 (file)
@@ -13,6 +13,7 @@ import static org.opendaylight.mdsal.binding.model.util.Types.BYTE_ARRAY;
 import static org.opendaylight.mdsal.binding.model.util.Types.STRING;
 import static extension org.apache.commons.text.StringEscapeUtils.escapeJava
 
+import com.google.common.base.Preconditions
 import com.google.common.collect.ImmutableList
 import com.google.common.collect.Lists
 import java.beans.ConstructorProperties
@@ -32,6 +33,7 @@ import org.opendaylight.mdsal.binding.model.api.Restrictions
 import org.opendaylight.mdsal.binding.model.api.Type
 import org.opendaylight.mdsal.binding.model.util.TypeConstants
 import org.opendaylight.yangtools.yang.binding.CodeHelpers
+import org.opendaylight.yangtools.yang.common.Empty
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition
 
 /**
@@ -336,6 +338,9 @@ class ClassTemplate extends BaseTemplate {
                     return new «genTO.name»(«Base64.importedName».getDecoder().decode(defaultValue));
                 «ELSEIF STRING.equals(prop.returnType)»
                     return new «genTO.name»(defaultValue);
+                «ELSEIF Constants.EMPTY.equals(prop.returnType)»
+                    «Preconditions.importedName».checkArgument(defaultValue.isEmpty(), "Invalid value %s", defaultValue);
+                    return new «genTO.name»(«Empty.importedName».getInstance());
                 «ELSEIF allProperties.size > 1»
                     «bitsArgs»
                 «ELSEIF BOOLEAN.equals(prop.returnType)»
index 094b164d8d15248f3c915dcb3ff351fca5fcfb13..194e73bd4fa2dd8b009a88511918edb2dc3a891c 100644 (file)
@@ -7,6 +7,10 @@
  */
 package org.opendaylight.mdsal.binding.java.api.generator;
 
+import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.util.Types;
+import org.opendaylight.yangtools.yang.common.Empty;
+
 /**
  * Various constants when generating JAVA source code.
  */
@@ -29,6 +33,9 @@ final class Constants {
      */
     public static final String MEMBER_REGEX_LIST = "regexes";
 
+    // This should live in a common artifact
+    static final Type EMPTY = Types.typeForClass(Empty.class);
+
     private Constants() {
 
     }
index 477ee19ace35a486635d3470bb18b331d9fd0402..05b8a23e9d1f0b7daeb6bc43ec1261bf9d008995 100644 (file)
@@ -17,13 +17,14 @@ import java.util.Base64;
 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject
 import org.opendaylight.mdsal.binding.model.api.Enumeration
 import org.opendaylight.mdsal.binding.model.api.Type
+import org.opendaylight.mdsal.binding.model.util.Types
+import org.opendaylight.yangtools.yang.common.Empty
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition
 
 /**
  * Template for generating JAVA class.
  */
 class UnionTemplate extends ClassTemplate {
-
     /**
      * Creates instance of this class with concrete <code>genType</code>.
      *
@@ -128,6 +129,9 @@ class UnionTemplate extends ClassTemplate {
                 «ELSEIF BYTE_ARRAY.equals(propRet.typedefReturnType)»
                     ««« generated byte[] typedef
                 return «Base64.importedName».getEncoder().encodeToString(«field».getValue());
+                «ELSEIF Constants.EMPTY.equals(propRet) || Constants.EMPTY.equals(propRet.typedefReturnType)»
+                    ««« generated empty typedef
+                return "";
                 «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject
                         && (propRet as GeneratedTransferObject).typedef  // Is it a typedef
                         && (propRet as GeneratedTransferObject).baseType instanceof BitsTypeDefinition»
index c2a3d2fa3a5282f6bf9a0ac789b142efb9d9499b..a50ac877b388de80f78c611e6607dfbdb4051418 100644 (file)
@@ -36,6 +36,7 @@ import java.util.stream.Collectors;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
+import org.opendaylight.yangtools.yang.common.Empty;
 
 /**
  * Test correct code generation.
@@ -391,7 +392,7 @@ public class CompilationTest extends BaseCompilationTest {
         CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader);
         CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean");
         CompilationTestUtils.assertContainsMethod(nodesClass, BigDecimal.class, "getIdDecimal64");
-        CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdEmpty");
+        CompilationTestUtils.assertContainsMethod(nodesClass, Empty.class, "getIdEmpty");
         CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdEnumeration", "getIdEnumeration", loader);
         testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg");
         testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier");
index ed49527410c7104454d3062c8e1072347f547337..7c99a60cb011cd929d9d912ad9632afad2ad8d2e 100644 (file)
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Pattern;
 import org.junit.Test;
+import org.opendaylight.yangtools.yang.common.Empty;
 
 /**
  * Test correct code generation.
@@ -316,18 +317,18 @@ public class TypedefCompilationTest extends BaseCompilationTest {
         assertFalse(unionExt4Class.isInterface());
         CompilationTestUtils.assertContainsField(unionExt4Class, "_unionExt3", unionExt3Class);
         CompilationTestUtils.assertContainsField(unionExt4Class, "_int32Ext2", int32Ext2Class);
-        CompilationTestUtils.assertContainsField(unionExt4Class, "_empty", Boolean.class);
+        CompilationTestUtils.assertContainsField(unionExt4Class, "_empty", Empty.class);
         CompilationTestUtils.assertContainsField(unionExt4Class, "_myDecimalType", myDecimalTypeClass);
         CompilationTestUtils.assertContainsFieldWithValue(unionExt4Class, "serialVersionUID", Long.TYPE,
             8089656970520476667L, new Class<?>[] { Boolean.class }, false);
         assertEquals(5, unionExt4Class.getDeclaredFields().length);
         CompilationTestUtils.assertContainsMethod(unionExt4Class, unionExt3Class, "getUnionExt3");
         CompilationTestUtils.assertContainsMethod(unionExt4Class, int32Ext2Class, "getInt32Ext2");
-        CompilationTestUtils.assertContainsMethod(unionExt4Class, Boolean.class, "isEmpty");
+        CompilationTestUtils.assertContainsMethod(unionExt4Class, Empty.class, "getEmpty");
         CompilationTestUtils.assertContainsMethod(unionExt4Class, myDecimalTypeClass, "getMyDecimalType");
         CompilationTestUtils.assertContainsConstructor(unionExt4Class, unionExt3Class);
         CompilationTestUtils.assertContainsConstructor(unionExt4Class, int32Ext2Class);
-        CompilationTestUtils.assertContainsConstructor(unionExt4Class, Boolean.class);
+        CompilationTestUtils.assertContainsConstructor(unionExt4Class, Empty.class);
         CompilationTestUtils.assertContainsConstructor(unionExt4Class, myDecimalTypeClass);
         CompilationTestUtils.assertContainsConstructor(unionExt4Class, unionExt4Class);
         assertEquals(5, unionExt4Class.getDeclaredConstructors().length);