[33] | 1 | package geniusweb.profile.utilityspace;
|
---|
| 2 |
|
---|
| 3 | import static org.junit.Assert.assertEquals;
|
---|
| 4 |
|
---|
| 5 | import java.io.IOException;
|
---|
| 6 | import java.math.BigDecimal;
|
---|
| 7 | import java.util.Arrays;
|
---|
| 8 | import java.util.HashMap;
|
---|
| 9 | import java.util.Map;
|
---|
| 10 |
|
---|
| 11 | import org.junit.Before;
|
---|
| 12 | import org.junit.Test;
|
---|
| 13 |
|
---|
| 14 | import com.fasterxml.jackson.core.JsonProcessingException;
|
---|
| 15 | import com.fasterxml.jackson.databind.ObjectMapper;
|
---|
| 16 | import com.fasterxml.jackson.databind.exc.ValueInstantiationException;
|
---|
| 17 |
|
---|
| 18 | import geniusweb.issuevalue.Bid;
|
---|
| 19 | import geniusweb.issuevalue.DiscreteValue;
|
---|
| 20 | import geniusweb.issuevalue.DiscreteValueSet;
|
---|
| 21 | import geniusweb.issuevalue.Domain;
|
---|
| 22 | import geniusweb.issuevalue.NumberValue;
|
---|
| 23 | import geniusweb.issuevalue.NumberValueSet;
|
---|
| 24 | import geniusweb.issuevalue.Value;
|
---|
| 25 | import geniusweb.issuevalue.ValueSet;
|
---|
| 26 | import geniusweb.profile.Profile;
|
---|
| 27 |
|
---|
| 28 | public class LinearAdditiveSerializationTest {
|
---|
| 29 |
|
---|
| 30 | private static final BigDecimal VAL2 = new BigDecimal("0.2");
|
---|
| 31 | private static final BigDecimal VAL3 = new BigDecimal("0.3");
|
---|
| 32 | private static final BigDecimal VAL4 = new BigDecimal("0.4");
|
---|
| 33 | private static final BigDecimal VAL6 = new BigDecimal("0.6");
|
---|
| 34 | private Map<String, ValueSetUtilities> utils = new HashMap<>();
|
---|
| 35 | private Map<String, BigDecimal> weights = new HashMap<>();
|
---|
| 36 | private static final String ISS1 = "issue1";
|
---|
| 37 | private static final String ISS2 = "issue2";
|
---|
| 38 | private DiscreteValue i1v1 = new DiscreteValue("issue1value1");
|
---|
| 39 | private DiscreteValue i1v2 = new DiscreteValue("issue1value2");
|
---|
| 40 | private NumberValue i2v1 = new NumberValue("15");
|
---|
| 41 | private NumberValue i2v2 = new NumberValue("16");
|
---|
| 42 | private Domain domain;
|
---|
| 43 |
|
---|
| 44 | private Map<DiscreteValue, BigDecimal> value1UtilsMap = new HashMap<>();
|
---|
| 45 | private DiscreteValueSetUtilities value;
|
---|
| 46 | private BigDecimal TWELVE = new BigDecimal("12");
|
---|
| 47 | private BigDecimal EIGHTEEN = new BigDecimal("18");
|
---|
| 48 | private static final ObjectMapper jackson = new ObjectMapper();
|
---|
| 49 |
|
---|
| 50 | private LinearAdditiveUtilitySpace space;
|
---|
| 51 |
|
---|
| 52 | 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\"}}}}";
|
---|
| 53 |
|
---|
| 54 | private String jobsjson = "{\"LinearAdditiveUtilitySpace\":{\"issueUtilities\":{"
|
---|
| 55 | + "\"lease car\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}},"
|
---|
| 56 | + "\"permanent contract\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}},"
|
---|
| 57 | + "\"career development opportunities\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"high\":1,\"low\":0,\"medium\":0.5}}},"
|
---|
| 58 | + "\"fte\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"1.0\":0.75,\"0.6\":0.25,\"0.8\":0.5}}},"
|
---|
| 59 | + "\"salary\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"4000\":1.0,\"2500\":0.25,\"3500\":0.75,\"2000\":0,\"3000\":0.3}}},"
|
---|
| 60 | + "\"work from home\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"1\":0.5,\"2\":0.666666666666,\"0\":0.333333333}}}},"
|
---|
| 61 | + "\"issueWeights\":{\"lease car\":0.06,\"permanent contract\":0.16,"
|
---|
| 62 | + "\"career development opportunities\":0.04,\"fte\":0.32,\"salary\":0.24,\"work from home\":0.18},"
|
---|
| 63 | + "\"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\"}}";
|
---|
| 64 | /**
|
---|
| 65 | * this domain has issues3 instead of issue2 in the domain description, but
|
---|
| 66 | * the profile is unchanged. Therefore the domain and profile don't match
|
---|
| 67 | */
|
---|
| 68 | private String serializedWrongIssues = "{\"LinearAdditiveUtilitySpace\":{"
|
---|
| 69 | + "\"domain\":{\"name\":\"test\","
|
---|
| 70 | + "\"issuesValues\":{\"issue2\":{\"values\":[\"issue2value1\",\"issue2value2\"]},"
|
---|
| 71 | + "\"issue3\":{\"values\":[\"issue1value1\",\"issue1value2\"]}}},"
|
---|
| 72 | + "\"name\":\"testprofile\"," + "\"issueUtilities\":"
|
---|
| 73 | + "{\"issue2\":{\"NumberValueSetUtilities\":{\"lowValue\":12,\"lowUtility\":0.3,\"highValue\":18,\"highUtility\":0.6}},"
|
---|
| 74 | + "\"issue1\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"issue1value1\":0.2,\"issue1value2\":0.3}}}},"
|
---|
| 75 | + "\"issueWeights\":{\"issue2\":0.4,\"issue1\":0.6},"
|
---|
| 76 | + "\"reservationBid\":{\"issuevalues\":{\"issue2\":\"issue2value1\",\"issue1\":\"issue1value2\"}}"
|
---|
| 77 | + "}" + "}";
|
---|
| 78 |
|
---|
| 79 | @Before
|
---|
| 80 | public void before() {
|
---|
| 81 | value1UtilsMap.put(i1v1, VAL2);
|
---|
| 82 | value1UtilsMap.put(i1v2, VAL3);
|
---|
| 83 | DiscreteValueSetUtilities val1utils = new DiscreteValueSetUtilities(
|
---|
| 84 | value1UtilsMap);
|
---|
| 85 | NumberValueSetUtilities val2utils = new NumberValueSetUtilities(TWELVE,
|
---|
| 86 | VAL3, EIGHTEEN, VAL6);
|
---|
| 87 |
|
---|
| 88 | Map<String, ValueSet> values = new HashMap<>();
|
---|
| 89 | values.put(ISS1, new DiscreteValueSet(Arrays.asList(i1v1, i1v2)));
|
---|
| 90 | values.put(ISS2, new NumberValueSet(TWELVE, EIGHTEEN, BigDecimal.ONE));
|
---|
| 91 | domain = new Domain("test", values);
|
---|
| 92 |
|
---|
| 93 | utils.put(ISS1, val1utils);
|
---|
| 94 | utils.put(ISS2, val2utils);
|
---|
| 95 | weights.put(ISS1, VAL6);
|
---|
| 96 | weights.put(ISS2, VAL4);
|
---|
| 97 |
|
---|
| 98 | Map<String, Value> issuevalues = new HashMap<>();
|
---|
| 99 | issuevalues.put(ISS1, i1v2);
|
---|
| 100 | issuevalues.put(ISS2, i2v1);
|
---|
| 101 | Bid reservationBid = new Bid(issuevalues);
|
---|
| 102 |
|
---|
| 103 | space = new LinearAdditiveUtilitySpace(domain, "testprofile", utils,
|
---|
| 104 | weights, reservationBid);
|
---|
| 105 | }
|
---|
| 106 |
|
---|
| 107 | @Test
|
---|
| 108 | public void testSerialize() throws JsonProcessingException {
|
---|
| 109 | String string = jackson.writeValueAsString(space);
|
---|
| 110 | System.out.println(string);
|
---|
| 111 | assertEquals(serialized, string);
|
---|
| 112 | }
|
---|
| 113 |
|
---|
| 114 | @Test
|
---|
| 115 | public void testDeserialize() throws IOException {
|
---|
| 116 | assertEquals(space, jackson.readValue(serialized, Profile.class));
|
---|
| 117 | }
|
---|
| 118 |
|
---|
| 119 | @Test(expected = ValueInstantiationException.class)
|
---|
| 120 | public void testDeserializeWrongIssues() throws IOException {
|
---|
| 121 | jackson.readValue(serializedWrongIssues, Profile.class);
|
---|
| 122 | }
|
---|
| 123 |
|
---|
| 124 | @Test
|
---|
| 125 | public void testDeserializeFromValue() throws IOException {
|
---|
| 126 | assertEquals(space, jackson.readValue(serialized, Profile.class));
|
---|
| 127 | }
|
---|
| 128 |
|
---|
| 129 | @Test
|
---|
| 130 | public void testDeserializeJobs() throws IOException {
|
---|
| 131 | Profile jobs = jackson.readValue(jobsjson, Profile.class);
|
---|
| 132 | }
|
---|
| 133 |
|
---|
| 134 | }
|
---|