It is possible to write tests using the abc assembler. The assembler code can be found in /utils/abcasm. Tests can be found in /test/acceptance/abcasm and end with the .abs extension. The tests are run using the same runtests.py script that is used for the actionscript tests.
When run, the assembler tests include the abcasm/abs_helper.as file which defines the following functions:
START(Summary:String):void - Start a new test section described by Summary END():void - Test section finished COMPARE_STRICTEQ(name:String, expected:*, actual:*):void - Compare the results of a testcase where name is the testcase name COMPARE_TYPEERROR(name:String, expected:*, actual:*):void - Special function for comparing TypeErrors (RuntimeErrors) - Will only compare the first 22 chars of expected and actual so that test can be run in Release and ReleaseDebugger configurations. COMPARE_NUMBEREQ(name:String, expected:*, actual:*, fractionDigits:int=-1):void - Compare 2 Numbers up to FractionDigits This is to be used for high precision numbers that may vary slightly due to platform differences.
Sample abcasm test
/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is [Open Source Virtual Machine.]. * * The Initial Developer of the Original Code is * Adobe System Incorporated. * Portions created by the Initial Developer are Copyright (C) 2009 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Adobe AS3 Team * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ function main() { getlocal0 pushscope findproperty START pushstring "instructions that start with the letter L" callpropvoid START 1 newfunction .function_id(runTest) getlocal0 call 0 findproperty END callpropvoid END 0 returnvoid } function runTest() { // test null <= null == True findproperty COMPARE_STRICTEQ pushstring "null lessequals null" // testname pushtrue // expected pushnull pushnull lessequals // actual callpropvoid COMPARE_STRICTEQ 3 // Use .try / .catch to catch TypeError // convert_o null .try { pushnull convert_o pop findproperty FAIL pushstring "convert_o null" pushstring "exception should have been thrown: TypeError: Error #1009: Cannot access a property or method of a null object reference." getlocal1 callpropvoid FAIL 3 jump finished_convert_o_null } .catch { getlocal0 pushscope setlocal2 // save typeError findproperty COMPARE_TYPEERROR pushstring "convert_o null" // test name pushstring "TypeError: Error #1009" // expected getlocal2 // actual callpropvoid COMPARE_TYPEERROR 3 } finished_convert_o_null: }