/******************************************************************************* * Copyright 2014 Analog Devices, Inc. * * Licensed 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 com.analog.lyric.dimple.test.core.parameterizedMessages; import static com.analog.lyric.util.test.ExceptionTester.*; import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import org.eclipse.jdt.annotation.Nullable; import com.analog.lyric.dimple.data.DataRepresentationType; import com.analog.lyric.dimple.model.values.Value; import com.analog.lyric.dimple.solvers.core.parameterizedMessages.IParameterizedMessage; import com.analog.lyric.dimple.solvers.core.parameterizedMessages.ParameterizedMessageBase; import com.analog.lyric.dimple.test.DimpleTestBase; import com.analog.lyric.util.test.SerializationTester; import com.google.common.primitives.Doubles; /** * Base class for IParameterizedMessage tests * * @since 0.06 * @author Christopher Barber */ public class TestParameterizedMessage extends DimpleTestBase { private static class BogusParameters extends ParameterizedMessageBase { private static final long serialVersionUID = 1L; @Override public BogusParameters clone() { return new BogusParameters(); } @Override public boolean objectEquals(@Nullable Object other) { return other instanceof BogusParameters; } @Override public void print(PrintStream out, int verbosity) { } @Override public double evalEnergy(Value value) { return 0; } @Override public double computeKLDivergence(IParameterizedMessage that) { return 0; } @Override public boolean isNull() { return true; } @Override public void setFrom(IParameterizedMessage other) { } @Override public void setUniform() { } @Override protected double computeNormalizationEnergy() { return 0; } } public void assertGenericInvariants(IParameterizedMessage message) { assertTrue(message.objectEquals(message)); assertFalse(message.objectEquals("bogus")); assertEquals(DataRepresentationType.MESSAGE, message.representationType()); IParameterizedMessage clone1 = message.clone(); assertNotSame(clone1, message); assertTrue(message.objectEquals(clone1)); double divergence = message.computeKLDivergence(clone1); assertEquals(0.0, divergence, 1e-9); assertTrue(divergence >= 0.0); IParameterizedMessage clone2 = SerializationTester.clone(message); assertNotSame(clone2, message); assertTrue(message.objectEquals(clone2)); divergence = message.computeKLDivergence(clone2); assertEquals(0.0, divergence, 1e-9); assertTrue(divergence >= 0.0); double prevEnergy = clone2.getNormalizationEnergy(); if (Doubles.isFinite(prevEnergy)) { clone2.addNormalizationEnergy(1.0); assertEquals(1.0 + prevEnergy, clone2.getNormalizationEnergy(), 1e-15); assertFalse(message.objectEquals(clone2)); } clone2.setNull(); assertTrue(clone2.isNull()); if (!message.isNull()) { assertFalse(message.objectEquals(clone2)); } expectThrow(IllegalArgumentException.class, message, "computeKLDivergence", new BogusParameters()); assertEquals("", message.toString(-1)); ByteArrayOutputStream bout = new ByteArrayOutputStream(); message.print(new PrintStream(bout), -1); assertEquals("", bout.toString()); for (int verbosity = 0, prevLength = 0; verbosity < 3; ++verbosity) { String desc = message.toString(verbosity); assertTrue(desc.length() >= prevLength); prevLength = desc.length(); } clone2.setFrom(message); assertTrue(message.objectEquals(clone2)); } }