/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Pavel Savara * - Initial implementation *******************************************************************************/ package net.sf.robocode.serialization; import net.sf.robocode.peer.BulletCommand; import net.sf.robocode.peer.DebugProperty; import net.sf.robocode.peer.ExecCommands; import net.sf.robocode.peer.TeamMessage; import net.sf.robocode.robotpaint.Graphics2DSerialized; import net.sf.robocode.security.HiddenAccess; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import robocode.util.Utils; import javax.swing.*; import java.awt.*; import java.awt.geom.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * @author Pavel Savara (original) */ public class RbSerializerTest { @BeforeClass public static void init() { // we need to switch off engine classloader for this test System.setProperty("NOSECURITY", "true"); System.setProperty("WORKINGDIRECTORY", "target//test-classes"); System.setProperty("TESTING", "true"); HiddenAccess.initContainer(); } @Test public void empty() throws IOException { HiddenAccess.initContainer(); ExecCommands ec = new ExecCommands(); ec.setBodyTurnRemaining(150.123); ec.setTryingToPaint(true); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); RbSerializer rbs = new RbSerializer(); rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); assertNear(ec2.getBodyTurnRemaining(), ec.getBodyTurnRemaining()); Assert.assertEquals(ec2.isTryingToPaint(), true); } @Test public void withBullets() throws IOException { ExecCommands ec = new ExecCommands(); ec.setBodyTurnRemaining(150.123); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getProjectiles().add(new BulletCommand(1.0, false, 0.9454, 12)); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9554, -128)); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); RbSerializer rbs = new RbSerializer(); rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); assertNear(ec2.getBodyTurnRemaining(), ec.getBodyTurnRemaining()); assertNear(ec2.getProjectiles().get(0).getPower(), 1.0); Assert.assertEquals(ec2.getProjectiles().get(1).isFireAssistValid(), false); Assert.assertEquals(ec2.getProjectiles().get(2).isFireAssistValid(), true); Assert.assertEquals(ec2.getProjectiles().get(2).getId(), -128); } @Test public void withMessages() throws IOException { ExecCommands ec = new ExecCommands(); ec.setBodyTurnRemaining(150.123); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); final byte[] data = new byte[20]; data[10] = 10; ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", data)); ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); RbSerializer rbs = new RbSerializer(); rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); Assert.assertEquals(ec2.getTeamMessages().get(0).message[0], 0); Assert.assertEquals(ec2.getTeamMessages().get(0).message[10], 10); Assert.assertEquals(ec2.getTeamMessages().get(0).sender, "Foo"); Assert.assertEquals(ec2.getTeamMessages().get(0).recipient, "Bar"); Assert.assertEquals(ec2.getTeamMessages().get(1).message, null); } @Test public void withProperties() throws IOException { ExecCommands ec = new ExecCommands(); ec.setBodyTurnRemaining(150.123); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); ec.getDebugProperties().add( new DebugProperty("UTF8 Native characters", "P��li� �lu?ou�k� k�� �p�l ��belsk� �dy")); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); RbSerializer rbs = new RbSerializer(); rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); Assert.assertEquals(ec2.getDebugProperties().get(0).getKey(), "UTF8 Native characters"); Assert.assertEquals(ec2.getDebugProperties().get(0).getValue(), "P��li� �lu?ou�k� k�� �p�l ��belsk� �dy"); } // @Test // 14 seconds for 1000 000, // 15x faster public void speed() throws IOException { ExecCommands ec = new ExecCommands(); ec.setBodyTurnRemaining(150.123); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); ec.getDebugProperties().add(new DebugProperty("ooooh", "aaaah")); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); for (int i = 0; i < 1000000; i++) { out.reset(); ec.setGunColor(i); RbSerializer rbs = new RbSerializer(); rbs.serialize(out, RbSerializer.ExecCommands_TYPE, ec); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ExecCommands ec2 = (ExecCommands) rbs.deserialize(in); Assert.assertEquals(ec2.getGunColor(), i); } } // @Test // 21 seconds for 100 000 public void speed2() { ExecCommands ec = new ExecCommands(); ec.setBodyTurnRemaining(150.123); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getProjectiles().add(new BulletCommand(1.0, true, 0.9354, 11)); ec.getTeamMessages().add(new TeamMessage("Foo", "Bar", null)); ec.getDebugProperties().add(new DebugProperty("ooooh", "aaaah")); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); for (int i = 0; i < 100000; i++) { out.reset(); ec.setGunColor(i); ExecCommands ec2 = (ExecCommands) ObjectCloner.deepCopy(ec); Assert.assertEquals(ec2.getGunColor(), i); } } @SuppressWarnings("serial") @Test public void graphics() throws InterruptedException { final Graphics2DSerialized sg = new Graphics2DSerialized(); sg.setPaintingEnabled(true); sg.setBackground(Color.GREEN); sg.setColor(Color.RED); Arc2D a = new Arc2D.Double(Arc2D.PIE); a.setAngleExtent(10); a.setAngleStart(-30); a.setFrame(0, 0, 80, 80); sg.draw(a); sg.setColor(Color.BLUE); sg.draw(new Line2D.Double(99, 98, 78, 3)); sg.setColor(Color.YELLOW); sg.draw(new Rectangle2D.Double(20, 20, 30, 50)); sg.setColor(Color.BLACK); sg.drawLine(99, 3, 78, 3); sg.drawRect(90, 20, 30, 50); sg.setColor(Color.CYAN); sg.setStroke(new BasicStroke(1, 2, BasicStroke.JOIN_ROUND, 4, null, 0)); sg.fill(new Rectangle2D.Double(20, 70, 30, 50)); sg.fill(new Ellipse2D.Double(70, 70, 30, 50)); sg.setColor(Color.MAGENTA); sg.fill(new RoundRectangle2D.Double(110, 70, 30, 50, 13.5, 16.1)); Canvas d = new Canvas() { @Override public void paint(Graphics g) { synchronized (this) { sg.processTo((Graphics2D) g); } } }; d.setSize(200, 200); JFrame f = new JFrame() {}; f.add(d); f.pack(); f.setVisible(true); f.setFocusable(true); Thread.sleep(100); f.setVisible(false); } public static void assertNear(double v1, double v2) { org.junit.Assert.assertEquals(v1, v2, Utils.NEAR_DELTA); } }