/* * The MIT License * * Copyright (c) 2016 Fulcrum Genomics * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ package picard.analysis; import org.testng.Assert; import org.testng.annotations.Test; public class MergeableMetricBaseTest { class TestMergeableMetric extends MergeableMetricBase { @MergeByAdding public Integer boxedInt = 1; @MergeByAdding public int unboxedInt = 2; @MergeByAdding public Double boxedDouble = 3D; @MergeByAdding public double unboxedDouble = 4D; @MergeByAdding public Long boxedLong = 5L; @MergeByAdding public long unboxedLong = 6L; @MergeByAdding public Float boxedFloat = 7F; @MergeByAdding public float unboxedFloat = 8F; @MergeByAdding public Short boxedShort = 9; @MergeByAdding public short unboxedShort = 10; @MergeByAdding public Byte boxedByte = 11; @MergeByAdding public byte unboxedByte = 12; @MergeByAssertEquals public String mustBeEqualString = "hello"; @MergeByAssertEquals public Double mustBeEqualDouble = 0.5; @MergeByAssertEquals public boolean mustBeEqualUnboxedBoolean = false; @MergeByAdding protected Integer protectedIntBase = 1; @MergeByAdding private Integer privateIntBase = 1; @NoMergingIsDerived protected double ratioIntValues; @Override public void calculateDerivedFields() { ratioIntValues = boxedInt / (double) unboxedInt; } } class TestMergeableMetricWithRestrictedMembers extends TestMergeableMetric { @MergeByAdding private Integer privateIntDerived = 1; @MergeByAdding protected Integer protectedIntDerived = 1; @MergeByAssertEquals private String privateString = "hi!"; @Override public void calculateDerivedFields() {} } @Test public void testMergingWithRestrictedMembers() { final TestMergeableMetricWithRestrictedMembers metric1 = new TestMergeableMetricWithRestrictedMembers(), metric2 = new TestMergeableMetricWithRestrictedMembers(); metric1.merge(metric2); Assert.assertEquals(metric1.boxedInt, (Integer) 2); Assert.assertEquals(metric1.unboxedInt, 4); Assert.assertEquals(metric1.privateIntDerived, (Integer) 2); Assert.assertEquals(metric1.protectedIntDerived, (Integer) 2); Assert.assertEquals(metric1.protectedIntBase, (Integer) 2); Assert.assertEquals(((TestMergeableMetric)metric1).privateIntBase, (Integer) 2); Assert.assertEquals(metric1.privateString, "hi!"); } @Test public void testMergingWithRestrictedMembersUsingBaseClass() { final MergeableMetricBase metric1 = new TestMergeableMetricWithRestrictedMembers(), metric2 = new TestMergeableMetricWithRestrictedMembers(); metric1.merge(metric2); Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).boxedInt, (Integer) 2); Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).unboxedInt, 4); Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).privateIntDerived, (Integer) 2); Assert.assertEquals(((TestMergeableMetricWithRestrictedMembers)metric1).privateString, "hi!"); } @Test public void testMerging() { final TestMergeableMetric metric1 = new TestMergeableMetric(), metric2 = new TestMergeableMetric(); metric1.merge(metric2); Assert.assertEquals(metric1.boxedInt, (Integer) 2); Assert.assertEquals(metric1.unboxedInt, 4); Assert.assertEquals(metric1.boxedDouble, 6D); Assert.assertEquals(metric1.unboxedDouble, 8D); Assert.assertEquals(metric1.boxedLong, (Long) 10L); Assert.assertEquals(metric1.unboxedLong, 12L); Assert.assertEquals(metric1.boxedFloat, 14F); Assert.assertEquals(metric1.unboxedFloat, 16F); Assert.assertEquals(metric1.boxedShort, (Short) (short) 18); Assert.assertEquals(metric1.unboxedShort, (short) 20); Assert.assertEquals(metric1.boxedByte, (Byte) (byte) 22); Assert.assertEquals(metric1.unboxedByte, 24); Assert.assertEquals(metric1.mustBeEqualDouble, metric2.mustBeEqualDouble); Assert.assertEquals(metric1.mustBeEqualString, metric2.mustBeEqualString); Assert.assertEquals(metric1.mustBeEqualUnboxedBoolean, metric2.mustBeEqualUnboxedBoolean); metric1.calculateDerivedFields(); Assert.assertEquals(metric1.ratioIntValues, 0.5D); } @Test(expectedExceptions = IllegalStateException.class) public void testMergingUnequalString() { final TestMergeableMetric metric1 = new TestMergeableMetric(), metric2 = new TestMergeableMetric(); metric1.mustBeEqualString = "goodbye"; Assert.assertFalse(metric1.canMerge(metric2)); metric1.merge(metric2); } @Test public void testMergingANull() { final TestMergeableMetric metric1 = new TestMergeableMetric(), metric2 = new TestMergeableMetric(); metric1.mustBeEqualString = "goodbye"; metric2.mustBeEqualString = null; Assert.assertTrue(metric1.canMerge(metric2)); metric1.merge(metric2); Assert.assertEquals(metric1.mustBeEqualString, "goodbye"); Assert.assertTrue(metric2.canMerge(metric1)); metric2.merge(metric1); Assert.assertEquals(metric2.mustBeEqualString, "goodbye"); } @Test(expectedExceptions = IllegalStateException.class) public void testMergingUnequalDouble() { final TestMergeableMetric metric1 = new TestMergeableMetric(), metric2 = new TestMergeableMetric(); metric1.mustBeEqualDouble = 1D; Assert.assertFalse(metric1.canMerge(metric2)); metric1.merge(metric2); } @Test(expectedExceptions = IllegalStateException.class) public void testMergingUnequalBoolean() { final TestMergeableMetric metric1 = new TestMergeableMetric(), metric2 = new TestMergeableMetric(); metric1.mustBeEqualUnboxedBoolean = true; Assert.assertFalse(metric1.canMerge(metric2)); metric1.merge(metric2); } private class TestMergeableMetricIllegal extends MergeableMetricBase { Integer undecorated = 0; @Override public void calculateDerivedFields() {} } @Test(expectedExceptions = IllegalStateException.class) public void testIllegalClass() { final TestMergeableMetricIllegal illegal1 = new TestMergeableMetricIllegal(), illegal2 = new TestMergeableMetricIllegal(); illegal1.merge(illegal2); } private class TestDerivedMergableMetric extends TestMergeableMetric { @MergeByAdding Integer anotherBoxed = 1; } @Test public void TestMergingDerivedClass() { final TestMergeableMetric instance1 = new TestMergeableMetric(); final TestDerivedMergableMetric instance2 = new TestDerivedMergableMetric(); instance1.merge(instance2); } @Test(expectedExceptions = IllegalArgumentException.class) public void TestMergingSuperClass() { final TestMergeableMetric instance1 = new TestMergeableMetric(); final TestDerivedMergableMetric instance2 = new TestDerivedMergableMetric(); instance2.merge(instance1); } @Test public void TestCanMerge() { final TestMergeableMetric instance1 = new TestMergeableMetric(); instance1.unboxedInt = 1; final TestDerivedMergableMetric instance2 = new TestDerivedMergableMetric(); instance2.unboxedInt = 2; instance1.merge(instance2); Assert.assertEquals(instance1.unboxedInt, 3); } }