Migrate YANG inputs for yang-data-codec-gson
[yangtools.git] / codec / yang-data-codec-gson / src / test / java / org / opendaylight / yangtools / yang / data / codec / gson / AbstractYT1027Test.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  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.data.codec.gson;
9
10 import static com.google.common.base.Verify.verify;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.hamcrest.Matchers.instanceOf;
13 import static org.junit.Assert.assertEquals;
14
15 import com.google.gson.stream.JsonReader;
16 import java.io.IOException;
17 import java.io.StringReader;
18 import java.io.StringWriter;
19 import java.io.Writer;
20 import org.junit.AfterClass;
21 import org.junit.BeforeClass;
22 import org.junit.Test;
23 import org.opendaylight.yangtools.yang.common.Decimal64;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.common.Uint64;
26 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
28 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
29 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
30 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
31 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
32 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
33 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
35 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
36 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
38 import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition;
39 import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition;
40 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
41
42 public abstract class AbstractYT1027Test {
43     private static final QName DECIMAL = QName.create("yt1027.test", "decimal");
44     private static final QName INT64 = QName.create(DECIMAL, "int64");
45     private static final QName UINT64 = QName.create(DECIMAL, "uint64");
46
47     static final LeafNode<?> DECIMAL_DATA = ImmutableNodes.leafNode(DECIMAL, Decimal64.valueOf("1.1"));
48     static final LeafNode<?> INT64_DATA = ImmutableNodes.leafNode(INT64, 2L);
49     static final LeafNode<?> UINT64_DATA = ImmutableNodes.leafNode(UINT64, Uint64.ONE);
50
51     static final String UNQUOTED_DECIMAL = """
52         {
53           "yt1027:decimal": 1.1
54         }""";
55     static final String UNQUOTED_INT64 = """
56         {
57           "yt1027:int64": 2
58         }""";
59     static final String UNQUOTED_UINT64 = """
60         {
61           "yt1027:uint64": 1
62         }""";
63
64     static EffectiveModelContext SCHEMA_CONTEXT;
65     private static DecimalTypeDefinition DECIMAL_TYPE;
66     private static Int64TypeDefinition INT64_TYPE;
67     private static Uint64TypeDefinition UINT64_TYPE;
68
69     @BeforeClass
70     public static void beforeClass() {
71         SCHEMA_CONTEXT = YangParserTestUtils.parseYang("""
72             module yt1027 {
73               namespace "yt1027.test";
74               prefix tst;
75
76               leaf uint64 {
77                 type uint64;
78               }
79
80               leaf int64 {
81                 type int64;
82               }
83
84               leaf decimal {
85                 type decimal64 {
86                   fraction-digits 1;
87                 }
88               }
89             }""");
90         DECIMAL_TYPE = (DecimalTypeDefinition) getTypeDefinition(DECIMAL);
91         INT64_TYPE = (Int64TypeDefinition) getTypeDefinition(INT64);
92         UINT64_TYPE = (Uint64TypeDefinition) getTypeDefinition(UINT64);
93     }
94
95     private static TypeDefinition<?> getTypeDefinition(final QName name) {
96         DataSchemaNode child = SCHEMA_CONTEXT.findDataTreeChild(name).orElseThrow();
97         verify(child instanceof LeafSchemaNode);
98         return ((LeafSchemaNode) child).getType();
99     }
100
101     @AfterClass
102     public static void afterClass() {
103         DECIMAL_TYPE = null;
104         INT64_TYPE = null;
105         UINT64_TYPE = null;
106         SCHEMA_CONTEXT = null;
107     }
108
109     @Test
110     public void testDecimal() {
111         assertThat(codecFactory().decimalCodec(DECIMAL_TYPE), instanceOf(wrapperClass()));
112     }
113
114     @Test
115     public void testInt64() {
116         assertThat(codecFactory().int64Codec(INT64_TYPE), instanceOf(wrapperClass()));
117     }
118
119     @Test
120     public void testUint64() {
121         assertThat(codecFactory().uint64Codec(UINT64_TYPE), instanceOf(wrapperClass()));
122     }
123
124     @Test
125     public void testDecimalSerialization() throws IOException {
126         assertEquals(expectedDecimal(), toJSON(DECIMAL_DATA));
127     }
128
129     @Test
130     public void testInt64Serialization() throws IOException {
131         assertEquals(expectedInt64(), toJSON(INT64_DATA));
132     }
133
134     @Test
135     public void testUint64Serialization() throws IOException {
136         assertEquals(expectedUint64(), toJSON(UINT64_DATA));
137     }
138
139     @Test
140     public void testDecimalParsing() throws IOException {
141         assertEquals(DECIMAL_DATA, fromJSON(expectedDecimal()));
142     }
143
144     @Test
145     public void testInt64Parsing() throws IOException {
146         assertEquals(INT64_DATA, fromJSON(expectedInt64()));
147     }
148
149     @Test
150     public void testUint64Parsing() throws IOException {
151         assertEquals(UINT64_DATA, fromJSON(expectedUint64()));
152     }
153
154     abstract JSONCodecFactory codecFactory();
155
156     abstract Class<?> wrapperClass();
157
158     abstract String expectedDecimal();
159
160     abstract String expectedInt64();
161
162     abstract String expectedUint64();
163
164     final NormalizedNode fromJSON(final String input) throws IOException {
165         final var result = new NormalizationResultHolder();
166         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
167         final var jsonParser = JsonParserStream.create(streamWriter, codecFactory());
168         jsonParser.parse(new JsonReader(new StringReader(input)));
169         return result.getResult().data();
170     }
171
172     private String toJSON(final NormalizedNode input) throws IOException {
173         final Writer writer = new StringWriter();
174         final NormalizedNodeStreamWriter jsonStream = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
175             codecFactory(), JsonWriterFactory.createJsonWriter(writer, 2));
176         try (NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(jsonStream)) {
177             nodeWriter.write(input);
178         }
179
180         return writer.toString();
181     }
182 }