import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import java.util.Collection;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
-import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractSchemaTreeStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.BoundStmtCtx;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStatementState;
.addOptional(YangStmtMapping.STATUS)
.addOptional(YangStmtMapping.WHEN)
.build();
+ private static final ImmutableSet<StatementDefinition> RFC6020_CASE_SHORTHANDS = ImmutableSet.of(
+ YangStmtMapping.ANYXML, YangStmtMapping.CONTAINER, YangStmtMapping.LEAF, YangStmtMapping.LIST,
+ YangStmtMapping.LEAF_LIST);
private static final SubstatementValidator RFC7950_VALIDATOR = SubstatementValidator.builder(YangStmtMapping.CHOICE)
.addAny(YangStmtMapping.ANYDATA)
.addAny(YangStmtMapping.ANYXML)
.addAny(YangStmtMapping.CASE)
+ .addAny(YangStmtMapping.CHOICE)
.addOptional(YangStmtMapping.CONFIG)
.addAny(YangStmtMapping.CONTAINER)
.addOptional(YangStmtMapping.DEFAULT)
.addOptional(YangStmtMapping.STATUS)
.addOptional(YangStmtMapping.WHEN)
.build();
+ private static final ImmutableSet<StatementDefinition> RFC7950_CASE_SHORTHANDS = ImmutableSet.of(
+ YangStmtMapping.ANYDATA, YangStmtMapping.ANYXML, YangStmtMapping.CHOICE, YangStmtMapping.CONTAINER,
+ YangStmtMapping.LEAF, YangStmtMapping.LIST, YangStmtMapping.LEAF_LIST);
- private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator) {
+ private final ImmutableSet<StatementDefinition> caseShorthands;
+
+ private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator,
+ final ImmutableSet<StatementDefinition> caseShorthands) {
super(YangStmtMapping.CHOICE, instantiatedPolicy(), config, requireNonNull(validator));
+ this.caseShorthands = requireNonNull(caseShorthands);
}
public static @NonNull ChoiceStatementSupport rfc6020Instance(final YangParserConfiguration config) {
- return new ChoiceStatementSupport(config, RFC6020_VALIDATOR);
+ return new ChoiceStatementSupport(config, RFC6020_VALIDATOR, RFC6020_CASE_SHORTHANDS);
}
public static @NonNull ChoiceStatementSupport rfc7950Instance(final YangParserConfiguration config) {
- return new ChoiceStatementSupport(config, RFC7950_VALIDATOR);
+ return new ChoiceStatementSupport(config, RFC7950_VALIDATOR, RFC7950_CASE_SHORTHANDS);
}
@Override
public Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final NamespaceStmtCtx parent,
final StatementDefinition stmtDef) {
- if (!YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(stmtDef)) {
+ if (!caseShorthands.contains(stmtDef)) {
return Optional.empty();
}
return Optional.of(verifyNotNull(parent.getFromNamespace(StatementSupportNamespace.class,
--- /dev/null
+/*
+ * Copyright (c) 2022 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.yangtools.yang.stmt;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.startsWith;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
+
+public class YT1410Test extends AbstractYangTest {
+ @Test
+ public void testRFC6020() {
+ assertInvalidSubstatementException(
+ startsWith("CHOICE is not valid for CHOICE. Error in module foo (QNameModule{ns=foo}) [at "),
+ "/bugs/YT1410/foo.yang");
+ }
+
+ @Test
+ public void testRFC7950() {
+ final var module = assertEffectiveModel("/bugs/YT1410/bar.yang").getModuleStatement(QName.create("bar", "bar"));
+ final var one = module.findSchemaTreeNode(QName.create("bar", "one")).orElseThrow();
+ assertThat(one, instanceOf(ChoiceEffectiveStatement.class));
+ final var two = ((ChoiceEffectiveStatement) one).findSchemaTreeNode(QName.create("bar", "two")).orElseThrow();
+ assertThat(two, instanceOf(CaseEffectiveStatement.class));
+ assertThat(((CaseEffectiveStatement) two).findSchemaTreeNode(QName.create("bar", "two")).orElseThrow(),
+ instanceOf(ChoiceEffectiveStatement.class));
+ }
+}