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