177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#
2932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# Copyright (C) 2010 The Android Open Source Project
3932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang#
4932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# Licensed under the Apache License, Version 2.0 (the "License");
5932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# you may not use this file except in compliance with the License.
6932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# You may obtain a copy of the License at
7932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang#
8932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang#      http://www.apache.org/licenses/LICENSE-2.0
9932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang#
10932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# Unless required by applicable law or agreed to in writing, software
11932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# distributed under the License is distributed on an "AS IS" BASIS,
12932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# See the License for the specific language governing permissions and
14932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang# limitations under the License.
15932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang#
16932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang
17932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang#
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Test the bcc compiler
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoimport unittest
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoimport subprocess
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoimport os
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoimport sys
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaogArmInitialized = False
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaogUseArm = True
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaogUseX86 = True
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaogRunOTCCOutput = True
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef parseArgv():
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    global gUseArm
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    global gUseX86
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    global gRunOTCCOutput
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    for arg in sys.argv[1:]:
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if arg == "--noarm":
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "--noarm: not testing ARM"
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            gUseArm = False
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        elif arg == "--nox86":
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "--nox86: not testing x86"
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            gUseX86 = False
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        elif arg == "--norunotcc":
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "--norunotcc detected, not running OTCC output"
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            gRunOTCCOutput = False
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        else:
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "Unknown parameter: ", arg
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            raise "Unknown parameter"
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    sys.argv = sys.argv[0:1]
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef compile(args):
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    proc = subprocess.Popen(["../libbcc_driver"] + args, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    result = proc.communicate()
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return result
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef runCmd(args):
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    result = proc.communicate()
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return result[0].strip()
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef uname():
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return runCmd(["uname"])
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef unameM():
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return runCmd(["uname", "-m"])
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef which(item):
6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return runCmd(["which", item])
6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef fileType(item):
7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return runCmd(["file", item])
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef outputCanRun():
7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    ft = fileType(which("bcc"))
7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return ft.find("ELF 32-bit LSB executable, Intel 80386") >= 0
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef checkEnvironment():
7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    global gRunOTCCOutput
7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    gRunOTCCOutput = uname() == "Linux" and unameM() != "x86_64" and outputCanRun()
7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef adb(args):
8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return runCmd(["adb"] + args)
8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef setupArm():
8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    global gArmInitialized
8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if gArmInitialized:
8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return
8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    print "Setting up arm"
8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    adb(["remount"])
8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    adb(["shell", "rm", "/system/bin/bcc"])
9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    adb(["shell", "mkdir", "/system/bin/bccdata"])
9177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    adb(["shell", "mkdir", "/system/bin/bccdata/data"])
9277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    # Clear out old data TODO: handle recursion
9377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    adb(["shell", "rm", "/system/bin/bccdata/data/*"])
9477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    # Copy over data
9577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    for root, dirs, files in os.walk("data"):
9677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        for d in dirs:
9777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            adb(["shell", "mkdir", os.path.join(root, d)])
9877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        for f in files:
9977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            adb(["push", os.path.join(root, f), os.path.join("/system/bin/bccdata", root, f)])
10077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    # Copy over compiler
10177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    adb(["sync"])
10277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    gArmInitialized = True
10377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
10477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef compileArm(args):
10577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    setupArm()
10677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    proc = subprocess.Popen(["adb", "shell", "/system/bin/bcc"] + args, stdout=subprocess.PIPE)
10777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    result = proc.communicate()
10877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return result[0].replace("\r","")
10977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
11077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef compare(a, b):
11177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if a != b:
11277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        firstDiff = firstDifference(a, b)
11377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        print "Strings differ at character %d. Common: %s. Difference '%s' != '%s'" % (
11477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            firstDiff, a[0:firstDiff], safeAccess(a, firstDiff), safeAccess(b, firstDiff))
11577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
11677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef safeAccess(s, i):
11777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if 0 <= i < len(s):
11877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return s[i]
11977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    else:
12077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        return '?'
12177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
12277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef firstDifference(a, b):
12377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    commonLen = min(len(a), len(b))
12477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    for i in xrange(0, commonLen):
12577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if a[i] != b[i]:
12677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            return i
12777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return commonLen
12877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
12977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# a1 and a2 are the expected stdout and stderr.
13077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# b1 and b2 are the actual stdout and stderr.
13177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Compare the two, sets. Allow any individual line
13277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# to appear in either stdout or stderr. This is because
13377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# the way we obtain output on the ARM combines both
13477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# streams into one sequence.
13577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
13677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef compareOuput(a1,a2,b1,b2):
13777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    while True:
13877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        totalLen = len(a1) + len(a2) + len(b1) + len(b2)
13977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        a1, b1 = matchCommon(a1, b1)
14077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        a1, b2 = matchCommon(a1, b2)
14177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        a2, b1 = matchCommon(a2, b1)
14277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        a2, b2 = matchCommon(a2, b2)
14377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        newTotalLen = len(a1) + len(a2) + len(b1) + len(b2)
14477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if newTotalLen == 0:
14577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            return True
14677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if newTotalLen == totalLen:
14777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "Failed at %d %d %d %d" % (len(a1), len(a2), len(b1), len(b2))
14877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "a1", a1
14977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "a2", a2
15077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "b1", b1
15177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print "b2", b2
15277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            return False
15377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
15477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef matchCommon(a, b):
15577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    """Remove common items from the beginning of a and b,
15677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       return just the tails that are different."""
15777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    while len(a) > 0 and len(b) > 0 and a[0] == b[0]:
15877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        a = a[1:]
15977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        b = b[1:]
16077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return a, b
16177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
16277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef rewritePaths(args):
16377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return [rewritePath(x) for x in args]
16477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
16577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef rewritePath(p):
16677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    """Take a path that's correct on the x86 and convert to a path
16777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao       that's correct on ARM."""
16877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    if p.startswith("data/"):
16977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        p = "/system/bin/bccdata/" + p
17077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return p
17177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
17277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoclass TestACC(unittest.TestCase):
17377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
17477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def checkResult(self, out, err, stdErrResult, stdOutResult=""):
17577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        a1 = out.splitlines()
17677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        a2 = err.splitlines()
17777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        b2 = stdErrResult.splitlines()
17877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        b1 = stdOutResult.splitlines()
17977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        self.assertEqual(True, compareOuput(a1,a2,b1,b2))
18077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
18177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def compileCheck(self, args, stdErrResult, stdOutResult="",
18277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                     targets=['arm', 'x86']):
18377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        global gUseArm
18477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        global gUseX86
18577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        targetSet = frozenset(targets)
18677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if gUseX86 and 'x86' in targetSet:
18777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            print args
18877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            out, err = compile(args)
18977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            self.checkResult(out, err, stdErrResult, stdOutResult)
19077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if gUseArm and 'arm' in targetSet:
19177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            out = compileArm(rewritePaths(args))
19277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            self.checkResult(out, "", stdErrResult, stdOutResult)
19377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
19477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def compileCheckArm(self, args, result):
19577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        self.assertEqual(compileArm(args), result)
19677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
19777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testCompileReturnVal(self):
19877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        self.compileCheck(["data/returnval-ansi.bc"], "")
19977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
20077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testCompileOTCCANSII(self):
20177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        self.compileCheck(["data/otcc-ansi.bc"], "", "", ['x86'])
20277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
20377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testRunReturnVal(self):
204b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/returnval-ansi.bc"],
20577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        "Executing compiled code:\nresult: 42\n")
20677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
20777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testStringLiteralConcatenation(self):
208b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/testStringConcat.bc"],
20977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        "Executing compiled code:\nresult: 13\n", "Hello, world\n")
21077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
21177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testRunOTCCANSI(self):
21277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        global gRunOTCCOutput
21377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if gRunOTCCOutput:
214b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao            self.compileCheck(["-c -R", "data/otcc-ansi.bc", "data/returnval.c"],
21577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                "Executing compiled code:\notcc-ansi.c: About to execute compiled code:\natcc-ansi.c: result: 42\nresult: 42\n", "",
21677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                 ['x86'])
21777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
21877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testRunOTCCANSI2(self):
21977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        global gRunOTCCOutput
22077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao        if gRunOTCCOutput:
221b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao            self.compileCheck(["-c -R", "data/otcc-ansi.bc", "data/otcc.c", "data/returnval.c"],
22277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                "Executing compiled code:\notcc-ansi.c: About to execute compiled code:\notcc.c: about to execute compiled code.\natcc-ansi.c: result: 42\nresult: 42\n", "",['x86'])
22377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
22477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testRunConstants(self):
225b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/constants.bc"],
22677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            "Executing compiled code:\nresult: 0\n",
22777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            "0 = 0\n010 = 8\n0x10 = 16\n'\\a' = 7\n'\\b' = 8\n'\\f' = 12\n'\\n' = 10\n'\\r' = 13\n'\\t' = 9\n'\\v' = 11\n'\\\\' = 92\n'\\'' = 39\n" +
22877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            "'\\\"' = 34\n'\\?' = 63\n'\\0' = 0\n'\\1' = 1\n'\\12' = 10\n'\\123' = 83\n'\\x0' = 0\n'\\x1' = 1\n'\\x12' = 18\n'\\x123' = 35\n'\\x1f' = 31\n'\\x1F' = 31\n")
22977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
23077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testRunFloat(self):
231b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/float.bc"],
23277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            "Executing compiled code:\nresult: 0\n",
23377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            """Constants: 0 0 0 0.01 0.01 0.1 10 10 0.1
23477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint: 1 float: 2.2 double: 3.3
23577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao ftoi(1.4f)=1
23677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao dtoi(2.4)=2
23777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao itof(3)=3
23877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao itod(4)=4
23977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoglobals: 1 2 3 4
24077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoargs: 1 2 3 4
24177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolocals: 1 2 3 4
24277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaocast rval: 2 4
24377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaocast lval: 1.1 2 3.3 4
24477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
24577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
24677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testRunFlops(self):
247b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/flops.bc"],
24877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            """Executing compiled code:
24977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""",
25077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao"""-1.1 = -1.1
25177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao!1.2 = 0
25277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao!0 = 1
25377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble op double:
25477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 + 2 = 3
25577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 - 2 = -1
25677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 * 2 = 2
25777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 / 2 = 0.5
25877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat op float:
25977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 + 2 = 3
26077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 - 2 = -1
26177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 * 2 = 2
26277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 / 2 = 0.5
26377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble op float:
26477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 + 2 = 3
26577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 - 2 = -1
26677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 * 2 = 2
26777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 / 2 = 0.5
26877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble op int:
26977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 + 2 = 3
27077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 - 2 = -1
27177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 * 2 = 2
27277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 / 2 = 0.5
27377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint op double:
27477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 + 2 = 3
27577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 - 2 = -1
27677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 * 2 = 2
27777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 / 2 = 0.5
27877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble op double:
27977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 2: < 1   <= 1   == 0   >= 0   > 0   != 1
28077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 1: < 0   <= 1   == 1   >= 1   > 0   != 0
28177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2 op 1: < 0   <= 0   == 0   >= 1   > 1   != 1
28277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble op float:
28377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 2: < 1   <= 1   == 0   >= 0   > 0   != 1
28477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 1: < 0   <= 1   == 1   >= 1   > 0   != 0
28577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2 op 1: < 0   <= 0   == 0   >= 1   > 1   != 1
28677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat op float:
28777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 2: < 1   <= 1   == 0   >= 0   > 0   != 1
28877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 1: < 0   <= 1   == 1   >= 1   > 0   != 0
28977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2 op 1: < 0   <= 0   == 0   >= 1   > 1   != 1
29077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint op double:
29177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 2: < 1   <= 1   == 0   >= 0   > 0   != 1
29277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 1: < 0   <= 1   == 1   >= 1   > 0   != 0
29377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2 op 1: < 0   <= 0   == 0   >= 1   > 1   != 1
29477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble op int:
29577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 2: < 1   <= 1   == 0   >= 0   > 0   != 1
29677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1 op 1: < 0   <= 1   == 1   >= 1   > 0   != 0
29777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2 op 1: < 0   <= 0   == 0   >= 1   > 1   != 1
29877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaobranching: 1 0 1
29977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassi: 1 2 3 4 5 6 7 8 9 10 11 12
30077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassf: 1 2 3 4 5 6 7 8 9 10 11 12
30177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassd: 1 2 3 4 5 6 7 8 9 10 11 12
30277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassi: 1 2 3 4 5 6 7 8 9 10 11 12
30377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassf: 1 2 3 4 5 6 7 8 9 10 11 12
30477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassd: 1 2 3 4 5 6 7 8 9 10 11 12
30577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassi: 1 2 3 4 5 6 7 8 9 10 11 12
30677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassf: 1 2 3 4 5 6 7 8 9 10 11 12
30777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassd: 1 2 3 4 5 6 7 8 9 10 11 12
30877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotestpassidf: 1 2 3
30977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
31077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testCasts(self):
311b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/casts.bc"],
31277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao            """Executing compiled code:
31377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """Reading from a pointer: 3 3
31477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoWriting to a pointer: 4
31577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTesting casts: 3 3 4.5 4
31677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTesting reading (int*): 4
31777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTesting writing (int*): 8 9
31877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTesting reading (char*): 0x78 0x56 0x34 0x12
31977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTesting writing (char*): 0x87654321
32077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaof(10)
32177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoFunction pointer result: 70
32277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTesting read/write (float*): 8.8 9.9
32377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTesting read/write (double*): 8.8 9.9
32477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
32577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
32677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testChar(self):
327b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/char.bc"], """Executing compiled code:
32877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """a = 99, b = 41
32977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoga = 100, gb = 44""")
33077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
33177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testPointerArithmetic(self):
332b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/pointers.bc"], """Executing compiled code:
33377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """Pointer difference: 1 4
33477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoPointer addition: 2
33577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoPointer comparison to zero: 0 0 1
33677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoPointer comparison: 1 0 0 0 1
33777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
33877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testRollo3(self):
339b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/rollo3.bc"], """Executing compiled code:
34077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 10""", """""")
34177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
34277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testFloatDouble(self):
343b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/floatdouble.bc"], """Executing compiled code:
34477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """0.002 0.1 10""")
34577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
34677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testIncDec(self):
347b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/inc.bc"], """Executing compiled code:
34877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao0
34977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1
35077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2
35177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1
35277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1
35377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2
35477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1
35577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao0
35677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0
35777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
35877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
35977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testIops(self):
360b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/iops.bc"], """Executing compiled code:
36177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """Literals: 1 -1
36277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao++
36377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao0
36477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1
36577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2
36677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao3
36777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao4
36877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao5
36977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao6
37077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao7
37177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao8
37277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao9
37377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao--
37477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao10
37577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao9
37677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao8
37777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao7
37877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao6
37977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao5
38077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao4
38177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao3
38277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2
38377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao1
38477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao0
38577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
38677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
38777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testFilm(self):
388b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/film.bc"], """Executing compiled code:
38977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """testing...
39077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoTotal bad: 0
39177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
39277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
39377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testpointers2(self):
394b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/pointers2.bc"], """Executing compiled code:
39577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """a = 0, *pa = 0
39677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoa = 2, *pa = 2
39777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoa = 0, *pa = 0 **ppa = 0
39877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoa = 2, *pa = 2 **ppa = 2
39977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoa = 0, *pa = 0 **ppa = 0
40077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoa = 2, *pa = 2 **ppa = 2
40177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
40277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
40377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testassignmentop(self):
404b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/assignmentop.bc"], """Executing compiled code:
40577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """2 *= 5  10
40677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao20 /= 5  4
40777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao17 %= 5  2
40877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao17 += 5  22
40977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao17 -= 5  12
41077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao17<<= 1  34
41177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao17>>= 1  8
41277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao17&= 1  1
41377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao17^= 1  16
41477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao16|= 1  17
41577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao*f() = *f() + 10;
41677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaof()
41777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaof()
41877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoa = 10
41977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao*f() += 10;
42077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaof()
42177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoa = 10
42277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
42377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
42477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testcomma(self):
425b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/comma.bc"], """Executing compiled code:
42677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0""", """statement: 10
42777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoif: a = 0
42877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaowhile: b = 11
42977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofor: b = 22
43077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoreturn: 30
43177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoarg: 12
43277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""")
43377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
43477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testBrackets(self):
435b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/brackets.bc"], """Executing compiled code:
43677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoErrors: 0
43777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao2D Errors: 0
43877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0
43977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
44077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
44177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testShort(self):
442b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/short.bc"], """Executing compiled code:
44377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: -2
44477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
44577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
44677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testAssignment(self):
447b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/assignment.bc"], """Executing compiled code:
44877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 7
44977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
45077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
45177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testArray(self):
452b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/array.bc"], """Executing compiled code:
45377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaolocalInt: 3
45477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaolocalDouble: 3 3
45577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoglobalChar: 3
45677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoglobalDouble: 3
45777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaotestArgs: 0 2 4
45877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaotestDecay: Hi!
45977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotest2D:
46077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoabcdefghijklmnopabcd
46177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodefghijklmnopabcdefg
46277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoghijklmnopabcdefghij
46377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaojklmnopabcdefghijklm
46477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaomnopabcdefghijklmnop
46577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaopabcdefghijklmnopabc
46677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaocdefghijklmnopabcdef
46777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofghijklmnopabcdefghi
46877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoijklmnopabcdefghijkl
46977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolmnopabcdefghijklmno
47077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0
47177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
47277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
47377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testDefines(self):
474b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/defines.bc"], """Executing compiled code:
47577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 3
47677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
47777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
47877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testFuncArgs(self):
479b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/funcargs.bc"], """Executing compiled code:
48077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 4
48177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
48277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
48377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testB2071670(self):
484b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/b2071670.bc"], """Executing compiled code:
48577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 1092616192
48677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
48777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
48877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testStructs(self):
489b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/structs.bc"], """Executing compiled code:
49077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaotestCopying: 37 == 37
49177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaotestUnion: 1 == 0x3f800000
49277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaotestArgs: (6, 8, 10, 12)
49377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 6
49477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
49577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
49677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    def testAddressOf(self):
497b0fe1bab063bfbbf54bafc1f69ec4d88da8e88d2Shih-wei Liao        self.compileCheck(["-c -R", "data/addressOf.bc"], """Executing compiled code:
49877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaotestStruct: 10 10 10
49977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaotestArray: 1 1 1
50077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoresult: 0
50177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao""","""""")
50277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
50377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodef main():
50477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    checkEnvironment()
50577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    parseArgv()
50677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    unittest.main()
50777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
50877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoif __name__ == '__main__':
50977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    main()
51077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
511