package geniusweb.profile.utilityspace; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.exc.ValueInstantiationException; import geniusweb.issuevalue.Bid; import geniusweb.issuevalue.DiscreteValue; import geniusweb.issuevalue.DiscreteValueSet; import geniusweb.issuevalue.Domain; import geniusweb.issuevalue.NumberValue; import geniusweb.issuevalue.NumberValueSet; import geniusweb.issuevalue.Value; import geniusweb.issuevalue.ValueSet; import geniusweb.profile.Profile; public class LinearAdditiveSerializationTest { private static final BigDecimal VAL2 = new BigDecimal("0.2"); private static final BigDecimal VAL3 = new BigDecimal("0.3"); private static final BigDecimal VAL4 = new BigDecimal("0.4"); private static final BigDecimal VAL6 = new BigDecimal("0.6"); private Map utils = new HashMap<>(); private Map weights = new HashMap<>(); private static final String ISS1 = "issue1"; private static final String ISS2 = "issue2"; private DiscreteValue i1v1 = new DiscreteValue("issue1value1"); private DiscreteValue i1v2 = new DiscreteValue("issue1value2"); private NumberValue i2v1 = new NumberValue("15"); private NumberValue i2v2 = new NumberValue("16"); private Domain domain; private Map value1UtilsMap = new HashMap<>(); private DiscreteValueSetUtilities value; private BigDecimal TWELVE = new BigDecimal("12"); private BigDecimal EIGHTEEN = new BigDecimal("18"); private static final ObjectMapper jackson = new ObjectMapper(); private LinearAdditiveUtilitySpace space; private String serialized = "{\"LinearAdditiveUtilitySpace\":{\"domain\":{\"name\":\"test\",\"issuesValues\":{\"issue2\":{\"range\":{\"low\":12,\"high\":18,\"step\":1}},\"issue1\":{\"values\":[\"issue1value1\",\"issue1value2\"]}}},\"name\":\"testprofile\",\"issueUtilities\":{\"issue2\":{\"NumberValueSetUtilities\":{\"lowValue\":12,\"lowUtility\":0.3,\"highValue\":18,\"highUtility\":0.6}},\"issue1\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"issue1value1\":0.2,\"issue1value2\":0.3}}}},\"issueWeights\":{\"issue2\":0.4,\"issue1\":0.6},\"reservationBid\":{\"issuevalues\":{\"issue2\":15,\"issue1\":\"issue1value2\"}}}}"; private String jobsjson = "{\"LinearAdditiveUtilitySpace\":{\"issueUtilities\":{" + "\"lease car\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}}," + "\"permanent contract\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}}," + "\"career development opportunities\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"high\":1,\"low\":0,\"medium\":0.5}}}," + "\"fte\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"1.0\":0.75,\"0.6\":0.25,\"0.8\":0.5}}}," + "\"salary\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"4000\":1.0,\"2500\":0.25,\"3500\":0.75,\"2000\":0,\"3000\":0.3}}}," + "\"work from home\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"1\":0.5,\"2\":0.666666666666,\"0\":0.333333333}}}}," + "\"issueWeights\":{\"lease car\":0.06,\"permanent contract\":0.16," + "\"career development opportunities\":0.04,\"fte\":0.32,\"salary\":0.24,\"work from home\":0.18}," + "\"domain\":{\"name\":\"jobs\",\"issuesValues\":{\"lease car\":{\"values\":[\"yes\",\"no\"]},\"permanent contract\":{\"values\":[\"yes\",\"no\"]},\"career development opportunities\":{\"values\":[\"low\",\"medium\",\"high\"]},\"fte\":{\"values\":[\"0.6\",\"0.8\",\"1.0\"]},\"salary\":{\"values\":[\"2000\",\"2500\",\"3000\",\"3500\",\"4000\"]},\"work from home\":{\"values\":[\"0\",\"1\",\"2\"]}}},\"name\":\"jobs1\"}}"; /** * this domain has issues3 instead of issue2 in the domain description, but * the profile is unchanged. Therefore the domain and profile don't match */ private String serializedWrongIssues = "{\"LinearAdditiveUtilitySpace\":{" + "\"domain\":{\"name\":\"test\"," + "\"issuesValues\":{\"issue2\":{\"values\":[\"issue2value1\",\"issue2value2\"]}," + "\"issue3\":{\"values\":[\"issue1value1\",\"issue1value2\"]}}}," + "\"name\":\"testprofile\"," + "\"issueUtilities\":" + "{\"issue2\":{\"NumberValueSetUtilities\":{\"lowValue\":12,\"lowUtility\":0.3,\"highValue\":18,\"highUtility\":0.6}}," + "\"issue1\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"issue1value1\":0.2,\"issue1value2\":0.3}}}}," + "\"issueWeights\":{\"issue2\":0.4,\"issue1\":0.6}," + "\"reservationBid\":{\"issuevalues\":{\"issue2\":\"issue2value1\",\"issue1\":\"issue1value2\"}}" + "}" + "}"; @Before public void before() { value1UtilsMap.put(i1v1, VAL2); value1UtilsMap.put(i1v2, VAL3); DiscreteValueSetUtilities val1utils = new DiscreteValueSetUtilities( value1UtilsMap); NumberValueSetUtilities val2utils = new NumberValueSetUtilities(TWELVE, VAL3, EIGHTEEN, VAL6); Map values = new HashMap<>(); values.put(ISS1, new DiscreteValueSet(Arrays.asList(i1v1, i1v2))); values.put(ISS2, new NumberValueSet(TWELVE, EIGHTEEN, BigDecimal.ONE)); domain = new Domain("test", values); utils.put(ISS1, val1utils); utils.put(ISS2, val2utils); weights.put(ISS1, VAL6); weights.put(ISS2, VAL4); Map issuevalues = new HashMap<>(); issuevalues.put(ISS1, i1v2); issuevalues.put(ISS2, i2v1); Bid reservationBid = new Bid(issuevalues); space = new LinearAdditiveUtilitySpace(domain, "testprofile", utils, weights, reservationBid); } @Test public void testSerialize() throws JsonProcessingException { String string = jackson.writeValueAsString(space); System.out.println(string); assertEquals(serialized, string); } @Test public void testDeserialize() throws IOException { assertEquals(space, jackson.readValue(serialized, Profile.class)); } @Test(expected = ValueInstantiationException.class) public void testDeserializeWrongIssues() throws IOException { jackson.readValue(serializedWrongIssues, Profile.class); } @Test public void testDeserializeFromValue() throws IOException { assertEquals(space, jackson.readValue(serialized, Profile.class)); } @Test public void testDeserializeJobs() throws IOException { Profile jobs = jackson.readValue(jobsjson, Profile.class); } }