diff --git a/etc/libs-incl.xml b/etc/libs-incl.xml
index b3021a384..6c5f488eb 100644
--- a/etc/libs-incl.xml
+++ b/etc/libs-incl.xml
@@ -22,6 +22,7 @@
+
diff --git a/tests/build.xml b/tests/build.xml
index e6dfe880d..b7ff896b2 100644
--- a/tests/build.xml
+++ b/tests/build.xml
@@ -80,6 +80,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -162,6 +178,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/etc/astest-config.xml.in b/tests/etc/astest-config.xml.in
new file mode 100644
index 000000000..c2b0cf33a
--- /dev/null
+++ b/tests/etc/astest-config.xml.in
@@ -0,0 +1,111 @@
+
+
+
+ false
+ false
+ true
+
+ ../src/as
+
+
+ @flex_sdk_dir@/frameworks/libs
+ ../../dist/lib/ooolib.swc
+ ../../dist/lib/corelib.swc
+ ../../dist/lib/asunit.swc
+
+
+ @flex_sdk_dir@/frameworks/libs/player/{targetPlayerMajorVersion}
+
+
+ en_US
+
+
+ true
+ 20
+ 1000
+
+ flash.fonts.JREFontManager
+ flash.fonts.AFEFontManager
+ flash.fonts.BatikFontManager
+
+ @flex_sdk_dir@/frameworks/localFonts.ser
+
+
+
+ http://www.adobe.com/2006/mxml
+ @flex_sdk_dir@/frameworks/mxml-manifest.xml
+
+
+ false
+ true
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ true
+ false
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ false
+ false
+ true
+ true
+ false
+ true
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ true
+ true
+ true
+ true
+ false
+ false
+ true
+ false
+ false
+ true
+ true
+ false
+
+ 0x000000
+ 30
+
+ 1000
+ 15
+
+
+ 750
+ 700
+
+
+ Three Rings Design, Inc.
+ EN
+ Three Rings Design, Inc.
+
+
+ @flex_sdk_dir@/frameworks/libs/framework.swc
+ framework_3.2.0.3958.swz
+
+ framework_3.2.0.3958.swf
+
+
+ true
+ 10.0.0
+ true
+
diff --git a/tests/src/as/com/threerings/NaryaRunner.as b/tests/src/as/com/threerings/NaryaRunner.as
new file mode 100644
index 000000000..cae0faebb
--- /dev/null
+++ b/tests/src/as/com/threerings/NaryaRunner.as
@@ -0,0 +1,45 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings {
+import asunit.textui.TestRunner;
+
+[SWF(width='1000', height='800')]
+public class NaryaRunner extends TestRunner
+{
+
+ public function NaryaRunner()
+ {
+ start(AllTests, null, TestRunner.SHOW_TRACE);
+ }
+}
+}
+
+import asunit.framework.TestSuite;
+import com.threerings.io.StreamableTest;
+
+class AllTests extends TestSuite
+{
+ public function AllTests()
+ {
+ addTest(new StreamableTest());
+ }
+}
diff --git a/tests/src/as/com/threerings/io/ASStreamableSubset.as b/tests/src/as/com/threerings/io/ASStreamableSubset.as
new file mode 100644
index 000000000..438def271
--- /dev/null
+++ b/tests/src/as/com/threerings/io/ASStreamableSubset.as
@@ -0,0 +1,142 @@
+// GENERATED PREAMBLE START
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package com.threerings.io {
+
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+import com.threerings.io.SimpleStreamableObject;
+import com.threerings.util.Long;
+import com.threerings.io.TypedArray;
+import flash.utils.ByteArray;
+// GENERATED PREAMBLE END
+
+import com.threerings.util.Util;
+
+// GENERATED CLASSDECL START
+public class ASStreamableSubset extends SimpleStreamableObject
+{
+ public function ASStreamableSubset ()
+ {}
+// GENERATED CLASSDECL END
+
+ public static function createWithJavaDefaults () :ASStreamableSubset
+ {
+ var sub :ASStreamableSubset = new ASStreamableSubset();
+ sub.fillWithJavaDefaults();
+ return sub;
+ }
+
+ public function fillWithJavaDefaults () :void
+ {
+ bool1 = true;
+ short2 = 2;
+ int3 = 3;
+ long4 = Long.fromNumber(4);
+ float5 = 5;
+ double6 = 6;
+ char7 = 7;
+ byte8 = 8;
+ string1 = "one";
+ bools = TypedArray.create(Boolean, [true, false, true]);
+ bytes = new ByteArray();
+ bytes.writeByte(1);
+ bytes.writeByte(2);
+ bytes.writeByte(3);
+ ints = TypedArray.create(int, [1, 2, 3]);
+ }
+
+ public function equals (o :ASStreamableSubset) :Boolean
+ {
+ return bool1 === o.bool1 && short2 === o.short2 && int3 === o.int3 && long4.equals(o.long4) &&
+ float5 === o.float5 && double6 === o.double6 && char7 === o.char7 &&
+ byte8 === o.byte8 && string1 === o.string1 && nullString1 === o.nullString1 &&
+ Util.equals(bools, o.bools) && Util.equals(bytes, o.bytes) &&
+ Util.equals(ints, o.ints) && Util.equals(nullBools, o.nullBools) &&
+ Util.equals(nullBytes, o.nullBytes) && Util.equals(nullInts, o.nullInts);
+
+ }
+
+// GENERATED STREAMING START
+ public var bool1 :Boolean;
+ public var short2 :int;
+ public var int3 :int;
+ public var long4 :Long;
+ public var float5 :Number;
+ public var double6 :Number;
+ public var char7 :int;
+ public var byte8 :int;
+ public var string1 :String;
+ public var nullString1 :String;
+ public var bools :TypedArray;
+ public var bytes :ByteArray;
+ public var ints :TypedArray;
+ public var nullBools :TypedArray;
+ public var nullBytes :ByteArray;
+ public var nullInts :TypedArray;
+
+ override public function readObject (ins :ObjectInputStream) :void
+ {
+ super.readObject(ins);
+ bool1 = ins.readBoolean();
+ short2 = ins.readShort();
+ int3 = ins.readInt();
+ long4 = ins.readLong();
+ float5 = ins.readFloat();
+ double6 = ins.readDouble();
+ char7 = ins.readShort();
+ byte8 = ins.readByte();
+ string1 = ins.readField(String);
+ nullString1 = ins.readField(String);
+ bools = ins.readField(TypedArray.getJavaType(Boolean));
+ bytes = ins.readField(ByteArray);
+ ints = ins.readField(TypedArray.getJavaType(int));
+ nullBools = ins.readField(TypedArray.getJavaType(Boolean));
+ nullBytes = ins.readField(ByteArray);
+ nullInts = ins.readField(TypedArray.getJavaType(int));
+ }
+
+ override public function writeObject (out :ObjectOutputStream) :void
+ {
+ super.writeObject(out);
+ out.writeBoolean(bool1);
+ out.writeShort(short2);
+ out.writeInt(int3);
+ out.writeLong(long4);
+ out.writeFloat(float5);
+ out.writeDouble(double6);
+ out.writeShort(char7);
+ out.writeByte(byte8);
+ out.writeField(string1);
+ out.writeField(nullString1);
+ out.writeField(bools);
+ out.writeField(bytes);
+ out.writeField(ints);
+ out.writeField(nullBools);
+ out.writeField(nullBytes);
+ out.writeField(nullInts);
+ }
+// GENERATED STREAMING END
+
+}
+}
diff --git a/tests/src/as/com/threerings/io/StreamableTest.as b/tests/src/as/com/threerings/io/StreamableTest.as
new file mode 100644
index 000000000..ee7437d4c
--- /dev/null
+++ b/tests/src/as/com/threerings/io/StreamableTest.as
@@ -0,0 +1,59 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.io {
+import com.threerings.util.StringUtil;
+import com.threerings.util.Name;
+import flash.utils.ByteArray;
+import com.threerings.io.ObjectOutputStream;
+import com.threerings.io.ObjectInputStream;
+import com.threerings.presents.peer.data.ClientInfo;
+
+import asunit.framework.TestCase;
+
+public class StreamableTest extends TestCase
+{
+ public function testStreamingToSelf ():void
+ {
+ var sub:ASStreamableSubset = ASStreamableSubset.createWithJavaDefaults();
+ var written:ByteArray = new ByteArray();
+ var output:ObjectOutputStream = new ObjectOutputStream(written);
+ output.writeObject(sub);
+ written.position = 0;
+ var input:ObjectInputStream = new ObjectInputStream(written);
+ var read:ASStreamableSubset = input.readObject(ASStreamableSubset);
+ assertTrue(sub.equals(read));
+ }
+
+ public function testStreamingFromJava () :void
+ {
+ var sub:ASStreamableSubset = ASStreamableSubset.createWithJavaDefaults();
+ var javaData:ByteArray = StringUtil.unhexlate(
+ "ffff0024636f6d2e746872656572696e67732e696f2e415353747265616d61626c65537562736574" +
+ "01000200000003000000000000000440a0000040180000000000000007080100036f6e6500010000" +
+ "000301000101000000030102030100000003000000010000000200000003000000");
+ var input:ObjectInputStream = new ObjectInputStream(javaData);
+ var read :ASStreamableSubset = input.readObject(ASStreamableSubset);
+ assertTrue(sub.equals(read));
+
+ }
+}
+}
diff --git a/tests/src/java/com/threerings/io/ASStreamableSubset.java b/tests/src/java/com/threerings/io/ASStreamableSubset.java
new file mode 100644
index 000000000..a3ffd133f
--- /dev/null
+++ b/tests/src/java/com/threerings/io/ASStreamableSubset.java
@@ -0,0 +1,72 @@
+package com.threerings.io;
+
+//
+//$Id$
+//
+//Narya library - tools for developing networked games
+//Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved
+//http://www.threerings.net/code/narya/
+//
+//This library is free software; you can redistribute it and/or modify it
+//under the terms of the GNU Lesser General Public License as published
+//by the Free Software Foundation; either version 2.1 of the License, or
+//(at your option) any later version.
+//
+//This library is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+//Lesser General Public License for more details.
+//
+//You should have received a copy of the GNU Lesser General Public
+//License along with this library; if not, write to the Free Software
+//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import java.util.Arrays;
+
+import com.google.common.base.Objects;
+
+public class ASStreamableSubset extends SimpleStreamableObject
+{
+ public boolean bool1 = true;
+ public short short2 = 2;
+ public int int3 = 3;
+ public long long4 = 4;
+ public float float5 = 5;
+ public double double6 = 6;
+ public char char7 = (char)7;
+ public byte byte8 = 8;
+
+ public String string1 = "one";
+ public String nullString1;
+
+ public boolean[] bools = new boolean[] { true, false, true };
+ public byte[] bytes = new byte[] { 1, 2, 3 };
+ public int[] ints = new int[] { 1, 2, 3 };
+
+ public boolean[] nullBools;
+ public byte[] nullBytes;
+ public int[] nullInts;
+
+ @Override
+ public boolean equals (Object other)
+ {
+ if (!(other instanceof ASStreamableSubset)) {
+ return false;
+ }
+ ASStreamableSubset ow = (ASStreamableSubset)other;
+ return bool1 == ow.bool1 && byte8 == ow.byte8 && char7 == ow.char7 && short2 == ow.short2
+ && int3 == ow.int3 && long4 == ow.long4
+ && float5 == ow.float5
+ && double6 == ow.double6
+ &&
+
+ Objects.equal(string1, ow.string1)
+ && Objects.equal(nullString1, ow.nullString1)
+ &&
+
+ Arrays.equals(bools, ow.bools) && Arrays.equals(bytes, ow.bytes)
+ && Arrays.equals(ints, ow.ints) &&
+
+ Arrays.equals(nullBools, ow.nullBools) && Arrays.equals(nullBytes, ow.nullBytes);
+ }
+}