| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.avro.io.parsing; |
| |
| import java.util.Arrays; |
| import org.apache.avro.SchemaBuilder; |
| import org.apache.avro.SchemaValidationException; |
| import org.apache.avro.SchemaValidatorBuilder; |
| import org.apache.avro.Schema; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| /** ResolvingGrammarGenerator tests that are not Parameterized.*/ |
| public class TestResolvingGrammarGenerator2 { |
| @Test public void testFixed() throws java.io.IOException { |
| new ResolvingGrammarGenerator().generate |
| (Schema.createFixed("MyFixed", null, null, 10), |
| Schema.create(Schema.Type.BYTES)); |
| new ResolvingGrammarGenerator().generate |
| (Schema.create(Schema.Type.BYTES), |
| Schema.createFixed("MyFixed", null, null, 10)); |
| } |
| |
| Schema point2dFullname = SchemaBuilder.record("Point").namespace("written") |
| .fields() |
| .requiredDouble("x") |
| .requiredDouble("y") |
| .endRecord(); |
| |
| Schema point3dNoDefault = SchemaBuilder.record("Point").fields() |
| .requiredDouble("x") |
| .requiredDouble("y") |
| .requiredDouble("z") |
| .endRecord(); |
| |
| Schema point2d = SchemaBuilder.record("Point2D") |
| .fields() |
| .requiredDouble("x") |
| .requiredDouble("y") |
| .endRecord(); |
| |
| Schema point3d = SchemaBuilder.record("Point3D").fields() |
| .requiredDouble("x") |
| .requiredDouble("y") |
| .name("z").type().doubleType().doubleDefault(0.0) |
| .endRecord(); |
| |
| Schema point3dMatchName = SchemaBuilder.record("Point").fields() |
| .requiredDouble("x") |
| .requiredDouble("y") |
| .name("z").type().doubleType().doubleDefault(0.0) |
| .endRecord(); |
| |
| @Test(expected=SchemaValidationException.class) |
| public void testUnionResolutionNoStructureMatch() throws Exception { |
| // there is a short name match, but the structure does not match |
| Schema read = Schema.createUnion(Arrays.asList( |
| Schema.create(Schema.Type.NULL), |
| point3dNoDefault)); |
| |
| new SchemaValidatorBuilder().canBeReadStrategy().validateAll() |
| .validate(point2dFullname, Arrays.asList(read)); |
| } |
| |
| @Test |
| public void testUnionResolutionFirstStructureMatch2d() throws Exception { |
| // multiple structure matches with no short or full name matches |
| Schema read = Schema.createUnion(Arrays.asList( |
| Schema.create(Schema.Type.NULL), |
| point3dNoDefault, point2d, point3d)); |
| |
| Symbol grammar = new ResolvingGrammarGenerator().generate( |
| point2dFullname, read); |
| Assert.assertTrue(grammar.production[1] instanceof Symbol.UnionAdjustAction); |
| |
| Symbol.UnionAdjustAction action = (Symbol.UnionAdjustAction) |
| grammar.production[1]; |
| Assert.assertEquals(2, action.rindex); |
| } |
| |
| @Test |
| public void testUnionResolutionFirstStructureMatch3d() throws Exception { |
| // multiple structure matches with no short or full name matches |
| Schema read = Schema.createUnion(Arrays.asList( |
| Schema.create(Schema.Type.NULL), |
| point3dNoDefault, point3d, point2d)); |
| |
| Symbol grammar = new ResolvingGrammarGenerator().generate( |
| point2dFullname, read); |
| Assert.assertTrue(grammar.production[1] instanceof Symbol.UnionAdjustAction); |
| |
| Symbol.UnionAdjustAction action = (Symbol.UnionAdjustAction) |
| grammar.production[1]; |
| Assert.assertEquals(2, action.rindex); |
| } |
| |
| @Test |
| public void testUnionResolutionNamedStructureMatch() throws Exception { |
| // multiple structure matches with a short name match |
| Schema read = Schema.createUnion(Arrays.asList( |
| Schema.create(Schema.Type.NULL), |
| point2d, point3dMatchName, point3d)); |
| |
| Symbol grammar = new ResolvingGrammarGenerator().generate( |
| point2dFullname, read); |
| Assert.assertTrue(grammar.production[1] instanceof Symbol.UnionAdjustAction); |
| |
| Symbol.UnionAdjustAction action = (Symbol.UnionAdjustAction) |
| grammar.production[1]; |
| Assert.assertEquals(2, action.rindex); |
| } |
| |
| @Test |
| public void testUnionResolutionFullNameMatch() throws Exception { |
| // there is a full name match, so it should be chosen |
| Schema read = Schema.createUnion(Arrays.asList( |
| Schema.create(Schema.Type.NULL), |
| point2d, point3dMatchName, point3d, point2dFullname)); |
| |
| Symbol grammar = new ResolvingGrammarGenerator().generate( |
| point2dFullname, read); |
| Assert.assertTrue(grammar.production[1] instanceof Symbol.UnionAdjustAction); |
| |
| Symbol.UnionAdjustAction action = (Symbol.UnionAdjustAction) |
| grammar.production[1]; |
| Assert.assertEquals(4, action.rindex); |
| } |
| } |