118 lines
3.8 KiB
Haskell
118 lines
3.8 KiB
Haskell
module TestByteCodeGenerator where
|
|
|
|
import Test.HUnit
|
|
import ByteCode.ClassFile.Generator
|
|
import ByteCode.ClassFile
|
|
import ByteCode.Constants
|
|
import Ast
|
|
|
|
nakedClass = Class "Testklasse" [] []
|
|
expectedClass = ClassFile {
|
|
constantPool = [
|
|
ClassInfo 4,
|
|
MethodRefInfo 1 3,
|
|
NameAndTypeInfo 5 6,
|
|
Utf8Info "java/lang/Object",
|
|
Utf8Info "<init>",
|
|
Utf8Info "()V",
|
|
Utf8Info "Code",
|
|
ClassInfo 9,
|
|
Utf8Info "Testklasse"
|
|
],
|
|
accessFlags = accessPublic,
|
|
thisClass = 8,
|
|
superClass = 1,
|
|
fields = [],
|
|
methods = [],
|
|
attributes = []
|
|
}
|
|
|
|
classWithFields = Class "Testklasse" [] [VariableDeclaration "int" "testvariable" Nothing]
|
|
expectedClassWithFields = ClassFile {
|
|
constantPool = [
|
|
ClassInfo 4,
|
|
MethodRefInfo 1 3,
|
|
NameAndTypeInfo 5 6,
|
|
Utf8Info "java/lang/Object",
|
|
Utf8Info "<init>",
|
|
Utf8Info "()V",
|
|
Utf8Info "Code",
|
|
ClassInfo 9,
|
|
Utf8Info "Testklasse",
|
|
FieldRefInfo 8 11,
|
|
NameAndTypeInfo 12 13,
|
|
Utf8Info "testvariable",
|
|
Utf8Info "I"
|
|
],
|
|
accessFlags = accessPublic,
|
|
thisClass = 8,
|
|
superClass = 1,
|
|
fields = [
|
|
MemberInfo {
|
|
memberAccessFlags = accessPublic,
|
|
memberNameIndex = 12,
|
|
memberDescriptorIndex = 13,
|
|
memberAttributes = []
|
|
}
|
|
],
|
|
methods = [],
|
|
attributes = []
|
|
}
|
|
|
|
method = MethodDeclaration "int" "add_two_numbers" [
|
|
ParameterDeclaration "int" "a",
|
|
ParameterDeclaration "int" "b" ]
|
|
(Block [Return (Just (BinaryOperation Addition (Reference "a") (Reference "b")))])
|
|
|
|
|
|
classWithMethod = Class "Testklasse" [method] []
|
|
expectedClassWithMethod = ClassFile {
|
|
constantPool = [
|
|
ClassInfo 4,
|
|
MethodRefInfo 1 3,
|
|
NameAndTypeInfo 5 6,
|
|
Utf8Info "java/lang/Object",
|
|
Utf8Info "<init>",
|
|
Utf8Info "()V",
|
|
Utf8Info "Code",
|
|
ClassInfo 9,
|
|
Utf8Info "Testklasse",
|
|
FieldRefInfo 8 11,
|
|
NameAndTypeInfo 12 13,
|
|
Utf8Info "add_two_numbers",
|
|
Utf8Info "(II)I"
|
|
],
|
|
accessFlags = accessPublic,
|
|
thisClass = 8,
|
|
superClass = 1,
|
|
fields = [],
|
|
methods = [
|
|
MemberInfo {
|
|
memberAccessFlags = accessPublic,
|
|
memberNameIndex = 12,
|
|
memberDescriptorIndex = 13,
|
|
memberAttributes = [
|
|
CodeAttribute {
|
|
attributeMaxStack = 420,
|
|
attributeMaxLocals = 420,
|
|
attributeCode = [Opiadd]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
attributes = []
|
|
}
|
|
|
|
testBasicConstantPool = TestCase $ assertEqual "basic constant pool" expectedClass $ classBuilder nakedClass emptyClassFile
|
|
testFields = TestCase $ assertEqual "fields in constant pool" expectedClassWithFields $ classBuilder classWithFields emptyClassFile
|
|
testMethodDescriptor = TestCase $ assertEqual "method descriptor" "(II)I" (methodDescriptor method)
|
|
testMethodAssembly = TestCase $ assertEqual "method assembly" expectedClassWithMethod (classBuilder classWithMethod emptyClassFile)
|
|
testFindMethodIndex = TestCase $ assertEqual "find method" (Just 0) (findMethodIndex expectedClassWithMethod "add_two_numbers")
|
|
|
|
tests = TestList [
|
|
TestLabel "Basic constant pool" testBasicConstantPool,
|
|
TestLabel "Fields constant pool" testFields,
|
|
TestLabel "Method descriptor building" testMethodDescriptor,
|
|
TestLabel "Method assembly" testMethodAssembly,
|
|
TestLabel "Find method by name" testFindMethodIndex
|
|
] |