package geniusweb.exampleparties.simpleshaop; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.websocket.DeploymentException; import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import geniusweb.actions.Action; import geniusweb.actions.PartyId; import geniusweb.bidspace.AllBidsList; import geniusweb.connection.ConnectionEnd; import geniusweb.inform.Inform; import geniusweb.inform.Settings; import geniusweb.issuevalue.Bid; import geniusweb.issuevalue.DiscreteValue; import geniusweb.issuevalue.Value; import geniusweb.profile.Profile; import geniusweb.profileconnection.ProfileConnectionFactory; import geniusweb.profileconnection.ProfileInterface; import geniusweb.progress.ProgressRounds; import geniusweb.references.Parameters; import geniusweb.references.ProfileRef; import geniusweb.references.ProtocolRef; import geniusweb.references.Reference; import tudelft.utilities.listener.DefaultListenable; import tudelft.utilities.logging.ReportToLogger; import tudelft.utilities.logging.Reporter; public class ShaopPartyTest { private static final String SHAOP = "SHAOP"; private static final PartyId otherparty = new PartyId("other"); // private static final String PROFILE = "src/test/resources/testprofile.json"; private static final String PROFILE = "src/test/resources/jobs1.json"; private final static ObjectMapper jackson = new ObjectMapper(); private ShaopParty party; private final TestConnection connection = new TestConnection(); private final ProtocolRef protocol = mock(ProtocolRef.class); private final ProgressRounds progress = mock(ProgressRounds.class); private Settings settings; private Profile profile; private final Parameters parameters = new Parameters(); @Before public void before() throws JsonParseException, JsonMappingException, IOException, URISyntaxException { party = new ShaopParty(); settings = new Settings(new PartyId("party1"), new ProfileRef(new URI("file:" + PROFILE)), protocol, progress, parameters); String serialized = new String(Files.readAllBytes(Paths.get(PROFILE)), StandardCharsets.UTF_8); profile = jackson.readValue(serialized, Profile.class); } @Test public void smokeTest() { } @Test public void getDescriptionTest() { assertNotNull(party.getDescription()); } /* * * @Test public void getCapabilitiesTest() { Capabilities capabilities = * party.getCapabilities(); assertFalse("party does not define protocols", * capabilities.getBehaviours().isEmpty()); } * * @Test public void testInformConnection() { party.connect(connection); // * agent should not start acting just after an inform assertEquals(0, * connection.getActions().size()); } * * @Test public void testInformSettings() { party.connect(connection); * connection.notifyListeners(settings); assertEquals(0, * connection.getActions().size()); } * * @Test public void testInformAndConnection() { party.connect(connection); * party.notifyChange(settings); assertEquals(0, * connection.getActions().size()); } * * @Test public void testOtherWalksAway() { party.connect(connection); * party.notifyChange(settings); * * party.notifyChange(new ActionDone(new EndNegotiation(otherparty))); * * // party should not act at this point assertEquals(0, * connection.getActions().size()); } * * @Test public void testAgentHasFirstTurn() { party.connect(connection); * party.notifyChange(settings); * * party.notifyChange(new YourTurn()); assertEquals(1, * connection.getActions().size()); assertTrue(connection.getActions().get(0) * instanceof Offer); } * * @Test public void testAgentElicitsComparison() { party.connect(connection); * party.notifyChange(settings); * * Bid bid = makeBid("3", "3"); // not yet in profile party.notifyChange(new * ActionDone(new Offer(otherparty, bid))); party.notifyChange(new YourTurn()); * assertEquals(1, connection.getActions().size()); * //assertTrue(connection.getActions().get(0) instanceof ElicitComparison); * * } * * @Ignore * * @Test public void testAgentAccepts() { // to make agent accept, the offered * bid must score >0.9 // we would need to mock a lot t make that happen // as * we need to place >10 comparable bids for that. party.connect(connection); * party.notifyChange(settings); * * Bid bid = makeBid("1", "1");// best pssible party.notifyChange(new * ActionDone(new Offer(otherparty, bid))); party.notifyChange(new YourTurn()); * assertEquals(1, connection.getActions().size()); * assertTrue(connection.getActions().get(0) instanceof Accept); * * } * * @Test public void testAgentLogsFinal() { // this log output is optional, this * is to show how to check log Reporter reporter = mock(Reporter.class); party = * new ShaopParty(reporter); party.connect(connection); * party.notifyChange(settings); party.notifyChange(new Finished(null)); * * verify(reporter).log(eq(Level.INFO), eq("Final ourcome:Finished[null]")); } * * @Test public void testAgentsUpdatesProgress() { party.connect(connection); * party.notifyChange(settings); * * party.notifyChange(new ActionDone(new Offer(null, mock(Bid.class)))); * * //party.notifyChange(new YourTurn()); //verify(progress).advance(); } * * @Test public void testGetCapabilities() { * assertTrue(party.getCapabilities().getBehaviours().contains(SHAOP)); } * * */ private Bid myMakeBid(String val1, String val2, String val3, String val4, String val5, String val6) { Map map = new HashMap<>(); map.put("lease car", new DiscreteValue(val1)); map.put("permanent contract", new DiscreteValue(val2)); map.put("career development opportunities", new DiscreteValue(val3)); map.put("fte", new DiscreteValue(val4)); map.put("salary", new DiscreteValue(val5)); map.put("work from home", new DiscreteValue(val6)); return new Bid(map); } private Bid makeBid(String val1, String val2) { Map map = new HashMap<>(); map.put("iss1", new DiscreteValue(val1)); map.put("iss2", new DiscreteValue(val2)); return new Bid(map); } @Test public void WinkyA2UpdateTest() { List bidOrder = new ArrayList(); String[] iss1 = { "yes", "no" }; String[] iss2 = { "yes", "no" }; String[] iss3 = { "low", "medium", "high" }; String[] iss4 = { "0.6", "0.8", "1.0" }; String[] iss5 = { "2000", "2500", "3000", "3500", "4000" }; String[] iss6 = { "0", "1", "2" }; for (int i = 0; i < 2; i++) { for (int j = 0; j < 1; j++) { for (int j2 = 0; j2 < 1; j2++) { for (int k = 0; k < 1; k++) { for (int k2 = 0; k2 < 3; k2++) { for (int l = 0; l < 1; l++) { bidOrder.add(myMakeBid(iss1[i], iss2[j], iss3[j2], iss4[k], iss5[k2], iss6[l])); } } } } } } AllBidsList allBids = new AllBidsList(profile.getDomain()); Reporter reporter = new ReportToLogger(""); ProfileInterface profileint = null; try { profileint = ProfileConnectionFactory.create(settings.getProfile().getURI(), reporter); } catch (IOException | DeploymentException e) { // TODO Auto-generated catch block e.printStackTrace(); } GravityEs g = new GravityEs(profile.getDomain(), bidOrder); Bid b = myMakeBid(iss1[1], iss2[1], iss3[0], iss4[0], iss5[0], iss6[0]); log2(g.getUtilityForBid(bidOrder.get(bidOrder.size() - 1))); /* * WinkyA2 winky = new WinkyA2(profile.getDomain(), bidOrder, profileint); * * * Bid b = myMakeBid(iss1[1], iss2[1], iss3[0], iss4[0], iss5[0], iss6[0]); * bidOrder.add(3, b); * * * log2("New bid => "+b+"\n\n"); * * WinkyA2 winky1 = new WinkyA2(profile.getDomain(), bidOrder, profileint); * * * bidOrder.remove(3); bidOrder.add(4, b); * * WinkyA2 winky2 = new WinkyA2(profile.getDomain(), bidOrder, profileint); */ } private void log2(Object o) { System.out.println(o); } @Test public void getBestBidInKnownSetTest() { /* * party.connect(connection); party.notifyChange(settings); * * //Bid myBid = makeBid("1", "1");// best pssible //party.myBids.add(myBid); * * Bid oppBid = makeBid("4", "4");// worst pssible party.oppBids.add(oppBid); * * * //assertEquals(0.0, party.getAgreementProbability(myBid, true),0.0000001 ); * assertEquals(1.0, party.getAgreementProbability(oppBid, true),0.0000001); * * * MyBidDetails b1 = party.getBestBidInKnownSet(0.1); * System.out.println(b1.getBid()+" => "+b1.getEu()); * party.myBids.add(b1.getBid()); * * MyBidDetails b2 = party.getBestBidInKnownSet(0.1); * System.out.println(b2.getBid()+" => "+b2.getEu()); * party.myBids.add(b2.getBid()); * * MyBidDetails b3 = party.getBestBidInKnownSet(0.1); * System.out.println(b3.getBid()+" => "+b3.getEu()); * party.myBids.add(b3.getBid()); * * MyBidDetails b4 = party.getBestBidInKnownSet(0.1); * System.out.println(b4.getBid()+" => "+b4.getEu()); */ } @Test public void testSendOffer() { /* * party.connect(connection); party.notifyChange(settings); * * party.notifyChange(new ActionDone(new Offer(null, makeBid("4", "4")))); * party.notifyChange( new YourTurn()); * * System.out.println("oppBids => " + party.oppBids ); * System.out.println("myBids => " + party.myBids ); */ // party.notifyChange(new ActionDone(new Offer(null, makeBid("3", "4")))); // party.notifyChange( new YourTurn() ); // System.out.println("oppBids => " + party.oppBids ); // System.out.println("myBids => " + party.myBids ); } } /** * A "real" connection object, because the party is going to subscribe etc, and * without a real connection we would have to do a lot of mocks that would make * the test very hard to read. * */ class TestConnection extends DefaultListenable implements ConnectionEnd { private List actions = new LinkedList<>(); @Override public void send(Action action) throws IOException { actions.add(action); } @Override public Reference getReference() { return null; } @Override public URI getRemoteURI() { return null; } @Override public void close() { } @Override public Error getError() { return null; } public List getActions() { return actions; } }