2 * Copyright (c) 2018 Pantheon Technologies, s.r.o.. 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.model.export;
10 import static org.junit.jupiter.api.Assertions.assertFalse;
11 import static org.junit.jupiter.api.Assertions.assertNotEquals;
13 import java.io.ByteArrayOutputStream;
14 import java.io.InputStream;
15 import java.nio.charset.StandardCharsets;
16 import javax.xml.stream.XMLStreamException;
17 import javax.xml.transform.stream.StreamSource;
18 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
19 import org.opendaylight.yangtools.yang.model.api.Module;
20 import org.opendaylight.yangtools.yang.model.api.Submodule;
21 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
22 import org.xmlunit.builder.DiffBuilder;
23 import org.xmlunit.diff.DefaultNodeMatcher;
24 import org.xmlunit.diff.ElementSelectors;
26 abstract class AbstractYinExportTest {
27 final void exportYinModules(final String yangDir, final String yinDir) throws XMLStreamException {
28 final var schemaContext = YangParserTestUtils.parseYangResourceDirectory(yangDir);
29 final var modules = schemaContext.getModules();
30 assertNotEquals(0, modules.size());
32 for (var module : modules) {
33 readAndValidateModule(schemaContext, module, yinDir);
35 for (var submodule : module.getSubmodules()) {
36 readAndValidateSubmodule(schemaContext, module, submodule, yinDir);
41 void validateOutput(final String yinDir, final String fileName, final String fileBody) {
42 assertNotEquals(0, fileBody.length());
44 assertXMLEquals(fileName,
45 AbstractYinExportTest.class.getResourceAsStream(yinDir + "/" + fileName),
50 private void readAndValidateModule(final EffectiveModelContext schemaContext, final Module module,
51 final String yinDir) throws XMLStreamException {
52 final String fileName = YinExportUtils.wellFormedYinName(module.getName(), module.getRevision());
53 validateOutput(yinDir, fileName, export(module));
56 private void readAndValidateSubmodule(final EffectiveModelContext schemaContext, final Module module,
57 final Submodule submodule, final String yinDir) throws XMLStreamException {
58 final var fileName = YinExportUtils.wellFormedYinName(submodule.getName(), submodule.getRevision());
59 validateOutput(yinDir, fileName, export(module, submodule));
62 private static String export(final Module module) throws XMLStreamException {
63 final var bos = new ByteArrayOutputStream();
64 YinExportUtils.writeModuleAsYinText(module.asEffectiveStatement(), bos);
65 return bos.toString(StandardCharsets.UTF_8);
68 private static String export(final Module module, final Submodule submodule) throws XMLStreamException {
69 final var bos = new ByteArrayOutputStream();
70 YinExportUtils.writeSubmoduleAsYinText(module.asEffectiveStatement(), submodule.asEffectiveStatement(), bos);
71 return bos.toString(StandardCharsets.UTF_8);
74 private static void assertXMLEquals(final String fileName, final InputStream expectedDoc, final String output) {
75 final var diff = DiffBuilder.compare(output)
76 .withTest(new StreamSource(expectedDoc))
77 .normalizeWhitespace()
78 .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
81 assertFalse(diff.hasDifferences(), diff.toString());