2 * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. 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.data.codec.gson;
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;
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;
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");
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);
51 static final String UNQUOTED_DECIMAL = """
55 static final String UNQUOTED_INT64 = """
59 static final String UNQUOTED_UINT64 = """
64 static EffectiveModelContext SCHEMA_CONTEXT;
65 private static DecimalTypeDefinition DECIMAL_TYPE;
66 private static Int64TypeDefinition INT64_TYPE;
67 private static Uint64TypeDefinition UINT64_TYPE;
70 public static void beforeClass() {
71 SCHEMA_CONTEXT = YangParserTestUtils.parseYang("""
73 namespace "yt1027.test";
90 DECIMAL_TYPE = (DecimalTypeDefinition) getTypeDefinition(DECIMAL);
91 INT64_TYPE = (Int64TypeDefinition) getTypeDefinition(INT64);
92 UINT64_TYPE = (Uint64TypeDefinition) getTypeDefinition(UINT64);
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();
102 public static void afterClass() {
106 SCHEMA_CONTEXT = null;
110 public void testDecimal() {
111 assertThat(codecFactory().decimalCodec(DECIMAL_TYPE), instanceOf(wrapperClass()));
115 public void testInt64() {
116 assertThat(codecFactory().int64Codec(INT64_TYPE), instanceOf(wrapperClass()));
120 public void testUint64() {
121 assertThat(codecFactory().uint64Codec(UINT64_TYPE), instanceOf(wrapperClass()));
125 public void testDecimalSerialization() throws IOException {
126 assertEquals(expectedDecimal(), toJSON(DECIMAL_DATA));
130 public void testInt64Serialization() throws IOException {
131 assertEquals(expectedInt64(), toJSON(INT64_DATA));
135 public void testUint64Serialization() throws IOException {
136 assertEquals(expectedUint64(), toJSON(UINT64_DATA));
140 public void testDecimalParsing() throws IOException {
141 assertEquals(DECIMAL_DATA, fromJSON(expectedDecimal()));
145 public void testInt64Parsing() throws IOException {
146 assertEquals(INT64_DATA, fromJSON(expectedInt64()));
150 public void testUint64Parsing() throws IOException {
151 assertEquals(UINT64_DATA, fromJSON(expectedUint64()));
154 abstract JSONCodecFactory codecFactory();
156 abstract Class<?> wrapperClass();
158 abstract String expectedDecimal();
160 abstract String expectedInt64();
162 abstract String expectedUint64();
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();
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);
180 return writer.toString();