Abc Assembler Tests

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