2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.tree.impl;
10 import static org.junit.jupiter.api.Assertions.assertThrows;
11 import static org.junit.jupiter.api.Assertions.assertTrue;
12 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
14 import org.junit.jupiter.api.AfterAll;
15 import org.junit.jupiter.api.BeforeAll;
16 import org.junit.jupiter.api.BeforeEach;
17 import org.junit.jupiter.api.Test;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
20 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
21 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
22 import org.opendaylight.yangtools.yang.data.tree.api.DataTree;
23 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
24 import org.opendaylight.yangtools.yang.data.tree.api.DataValidationFailedException;
25 import org.opendaylight.yangtools.yang.data.tree.impl.di.InMemoryDataTreeFactory;
26 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
28 class CaseExclusionTest {
29 private static EffectiveModelContext SCHEMA_CONTEXT;
31 private DataTree inMemoryDataTree;
34 static void beforeClass() {
35 SCHEMA_CONTEXT = TestModel.createTestContext("/case-exclusion-test.yang");
39 static void afterClass() {
40 SCHEMA_CONTEXT = null;
45 inMemoryDataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION,
50 void testCorrectCaseWrite() throws DataValidationFailedException {
51 final var choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
53 final var container = Builders
55 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
57 Builders.choiceBuilder().withNodeIdentifier(choice1Id)
58 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case1-leaf1"), "leaf-value"))
60 final var modificationTree = inMemoryDataTree.takeSnapshot().newModification();
61 modificationTree.write(TestModel.TEST_PATH, container);
62 modificationTree.ready();
64 inMemoryDataTree.validate(modificationTree);
65 final var prepare = inMemoryDataTree.prepare(modificationTree);
66 inMemoryDataTree.commit(prepare);
70 void testCaseExclusion() {
71 assertThrows(IllegalArgumentException.class, () -> {
72 final var choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
74 final var container = Builders
76 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
78 Builders.choiceBuilder()
79 .withNodeIdentifier(choice1Id)
80 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case1-leaf1"), "leaf-value"))
82 ImmutableNodes.containerNode(QName.create(TestModel.TEST_QNAME, "case2-cont")))
85 final var modificationTree = inMemoryDataTree.takeSnapshot().newModification();
86 modificationTree.write(TestModel.TEST_PATH, container);
87 modificationTree.ready();
89 inMemoryDataTree.validate(modificationTree);
90 final var prepare = inMemoryDataTree.prepare(modificationTree);
91 inMemoryDataTree.commit(prepare);
92 } catch (IllegalArgumentException e) {
93 assertTrue(e.getMessage().contains("implies non-presence of child"));
100 void testCaseExclusionOnChoiceWrite() {
101 assertThrows(IllegalArgumentException.class, () -> {
103 final var container = Builders.containerBuilder()
104 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
106 final var modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
107 modificationTree1.write(TestModel.TEST_PATH, container);
108 modificationTree1.ready();
110 inMemoryDataTree.validate(modificationTree1);
111 final var prepare1 = inMemoryDataTree.prepare(modificationTree1);
112 inMemoryDataTree.commit(prepare1);
115 final var choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
116 final var choice = Builders.choiceBuilder().withNodeIdentifier(choice1Id)
117 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case1-leaf1"), "leaf-value"))
118 .withChild(ImmutableNodes.containerNode(QName.create(TestModel.TEST_QNAME, "case2-cont"))).build();
121 final var modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
122 modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
123 modificationTree2.ready();
125 inMemoryDataTree.validate(modificationTree2);
127 final var prepare2 = inMemoryDataTree.prepare(modificationTree2);
128 inMemoryDataTree.commit(prepare2);
129 } catch (IllegalArgumentException e) {
130 assertTrue(e.getMessage().contains("implies non-presence of child"));