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 | }
|
---|