Bump byte-buddy to 1.15.2
[yangtools.git] / model / yang-model-export / src / test / java / org / opendaylight / yangtools / yang / model / export / AbstractYinExportTest.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o..  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.model.export;
9
10 import static org.junit.jupiter.api.Assertions.assertFalse;
11 import static org.junit.jupiter.api.Assertions.assertNotEquals;
12
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;
25
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());
31
32         for (var module : modules) {
33             readAndValidateModule(schemaContext, module, yinDir);
34
35             for (var submodule : module.getSubmodules()) {
36                 readAndValidateSubmodule(schemaContext, module, submodule, yinDir);
37             }
38         }
39     }
40
41     void validateOutput(final String yinDir, final String fileName, final String fileBody) {
42         assertNotEquals(0, fileBody.length());
43         if (yinDir != null) {
44             assertXMLEquals(fileName,
45                 AbstractYinExportTest.class.getResourceAsStream(yinDir + "/" + fileName),
46                 fileBody);
47         }
48     }
49
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));
54     }
55
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));
60     }
61
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);
66     }
67
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);
72     }
73
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))
79             .checkForIdentical()
80             .build();
81         assertFalse(diff.hasDifferences(), diff.toString());
82     }
83 }