/** * 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); } }