/* * Copyright (c) 2016 Cisco Systems, Inc. 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.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.util.Collection; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.UniqueConstraint; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Relative; import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; public class Bug5946Test { private static final String NS = "foo"; private static final String REV = "2016-05-26"; private static final QName L1 = QName.create(NS, REV, "l1"); private static final QName L2 = QName.create(NS, REV, "l2"); private static final QName L3 = QName.create(NS, REV, "l3"); private static final QName C = QName.create(NS, REV, "c"); private static final QName WITHOUT_UNIQUE = QName.create(NS, REV, "without-unique"); private static final QName SIMPLE_UNIQUE = QName.create(NS, REV, "simple-unique"); private static final QName MULTIPLE_UNIQUE = QName.create(NS, REV, "multiple-unique"); private static final SchemaNodeIdentifier L1_ID = SchemaNodeIdentifier.create(false, L1); private static final SchemaNodeIdentifier L2_ID = SchemaNodeIdentifier.create(false, L2); private static final SchemaNodeIdentifier C_L3_ID = SchemaNodeIdentifier.create(false, C, L3); @Test public void test() throws Exception { SchemaContext context = StmtTestUtils.parseYangSources(new File(getClass() .getResource("/bugs/bug5946/foo.yang").toURI())); assertNotNull(context); Collection<UniqueConstraint> uniqueConstraints = getListConstraints(context, WITHOUT_UNIQUE); assertNotNull(uniqueConstraints); assertTrue(uniqueConstraints.isEmpty()); Collection<UniqueConstraint> simpleUniqueConstraints = getListConstraints(context, SIMPLE_UNIQUE); assertNotNull(simpleUniqueConstraints); assertEquals(1, simpleUniqueConstraints.size()); Collection<Relative> simpleUniqueConstraintTag = simpleUniqueConstraints.iterator().next().getTag(); assertTrue(simpleUniqueConstraintTag.contains(L1_ID)); assertTrue(simpleUniqueConstraintTag.contains(C_L3_ID)); Collection<UniqueConstraint> multipleUniqueConstraints = getListConstraints(context, MULTIPLE_UNIQUE); assertNotNull(multipleUniqueConstraints); assertEquals(3, multipleUniqueConstraints.size()); boolean l1l2 = false; boolean l1cl3 = false; boolean cl3l2 = false; for (UniqueConstraint uniqueConstraint : multipleUniqueConstraints) { Collection<Relative> uniqueConstraintTag = uniqueConstraint.getTag(); if (uniqueConstraintTag.contains(L1_ID) && uniqueConstraintTag.contains(L2_ID)) { l1l2 = true; } else if (uniqueConstraintTag.contains(L1_ID) && uniqueConstraintTag.contains(C_L3_ID)) { l1cl3 = true; } else if (uniqueConstraintTag.contains(C_L3_ID) && uniqueConstraintTag.contains(L2_ID)) { cl3l2 = true; } } assertTrue(l1l2 && l1cl3 && cl3l2); } @Test public void testInvalid() throws Exception { try { StmtTestUtils.parseYangSources(new File(getClass().getResource("/bugs/bug5946/foo-invalid.yang").toURI())); fail("Should fail due to invalid argument of unique constraint"); } catch (ReactorException e) { assertTrue(e.getCause().getMessage().startsWith( "Unique statement argument '/simple-unique/l1' contains schema node identifier '/simple-unique/l1'" + " which is not in the descendant node identifier form.")); } } private static Collection<UniqueConstraint> getListConstraints(final SchemaContext context, final QName listQName) { DataSchemaNode dataChildByName = context.getDataChildByName(listQName); assertTrue(dataChildByName instanceof ListSchemaNode); return ((ListSchemaNode) dataChildByName).getUniqueConstraints(); } }