+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.generator.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.junit.jupiter.api.Test;
+import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeTypes;
+import org.opendaylight.mdsal.binding.runtime.api.GroupingRuntimeType;
+import org.opendaylight.mdsal.binding.runtime.api.RuntimeType;
+import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
+
+class Mdsal669Test {
+ private static final BindingRuntimeTypes RUNTIME_TYPES = new DefaultBindingRuntimeGenerator()
+ .generateTypeMapping(YangParserTestUtils.parseYangResource("/mdsal669.yang"));
+
+ @Test
+ void barIsUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "Bar"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "Foo"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "Target1"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev.used.augmented", "ToBeAugmented1"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev.used.augmented.indirect",
+ "ToBeAugmented1"));
+ }
+
+ @Test
+ void bazIsUsedByOneAndTwo() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "Baz"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "One"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "Two"));
+ }
+
+ @Test
+ void unusedIsNotUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "Unused"));
+ }
+
+ @Test
+ void fooAsStringIsNotUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "FooAsString"));
+ }
+
+ @Test
+ void unusedBarIsNotUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UnusedBar"));
+ }
+
+ @Test
+ void unusedAugmendIsNotUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UnusedAugmented"));
+ }
+
+ @Test
+ void unusedIntermediateAugmentedIsNotUsed() {
+ assertInstances(
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UnusedIntermediateAugmentedUser"));
+ assertInstances(
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UnusedIntermediateAugmented"));
+ }
+
+ @Test
+ void usedAugmentedIndirectIsUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmentedIndirectGrp"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmentedIndirectUser"));
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmentedIndirect"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmentedIndirectUser"));
+ }
+
+ @Test
+ void usedAugmentedIsUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmented"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmentedUser"));
+ }
+
+ @Test
+ void toBeAugmentedIsUsed() {
+ assertInstances(JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "ToBeAugmented"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmentedIndirectUser"),
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal669.norev", "UsedAugmentedUser"));
+ }
+
+ private static void assertInstances(final JavaTypeName groupingTypeName, final JavaTypeName... instanceTypeNames) {
+ assertEquals(
+ Arrays.stream(instanceTypeNames).map(Mdsal669Test::assertType).collect(Collectors.toSet()),
+ Set.copyOf(assertGrouping(groupingTypeName).instantiations()));
+ }
+
+ private static GroupingRuntimeType assertGrouping(final JavaTypeName typeName) {
+ return assertInstanceOf(GroupingRuntimeType.class, assertType(typeName));
+ }
+
+ private static RuntimeType assertType(final JavaTypeName typeName) {
+ return RUNTIME_TYPES.findSchema(typeName).orElseThrow();
+ }
+}