A "high-level" language for the Gameboy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

259 lines
7.0 KiB

import { expect } from "chai"
import { convertAssignStmt, prettyPrintIR, SSA } from "../lib/ir"
describe("ir", () => {
describe("convertExpr", () => {
it("load with immediate", () => {
const state = { nextID: 0, ssa_stmts: [] }
const ir = convertAssignStmt(state, {
type: "stmt",
stmt_type: "assign",
args: {
name: "x",
expr: 42,
},
})
expect(ir).to.deep.equal([
{
dest: {
type: "variable",
name: "x",
},
source: 42,
},
])
})
it("load with variable", () => {
const state = { nextID: 0, ssa_stmts: [] }
const ir = convertAssignStmt(state, {
type: "stmt",
stmt_type: "assign",
args: {
name: "x",
expr: "y",
},
})
expect(ir).to.deep.equal([
{
dest: {
type: "variable",
name: "x",
},
source: {
type: "variable",
name: "y",
},
},
])
})
it("unary op", () => {
const state = { nextID: 0, ssa_stmts: [] }
const ir = convertAssignStmt(state, {
type: "stmt",
stmt_type: "assign",
args: {
name: "x",
expr: {
type: "unary",
op: "arith_negate",
arg: "y"
},
},
})
expect(ir).to.deep.equal([
{
dest: {
type: "variable",
name: "x",
},
source: {
type: "variable",
name: "y",
},
op: "arith_negate",
},
])
})
it("binary op", () => {
const state = { nextID: 0, ssa_stmts: [] }
const ir = convertAssignStmt(state, {
type: "stmt",
stmt_type: "assign",
args: {
name: "x",
expr: {
type: "binary",
op: "add",
left: "y",
right: 42,
},
},
})
expect(ir).to.deep.equal([
{
dest: {
type: "variable",
name: "x",
},
source: {
type: "variable",
name: "y",
},
source1: 42,
op: "add",
},
])
})
it("nested binary op", () => {
const state = { nextID: 0, ssa_stmts: [] }
const ir = convertAssignStmt(state, {
type: "stmt",
stmt_type: "assign",
args: {
name: "x",
expr: {
type: "binary",
op: "add",
left: "y",
right: {
type: "binary",
op: "subtract",
left: "z",
right: 42,
},
},
},
})
expect(ir).to.deep.equal([
{
dest: {
type: "temporary",
name: "t0",
},
source: {
type: "variable",
name: "z",
},
op: "subtract",
source1: 42,
},
{
dest: {
type: "variable",
name: "x",
},
source: {
type: "variable",
name: "y",
},
op: "add",
source1: {
type: "temporary",
name: "t0",
},
},
])
})
})
describe("prettyPrintIR", () => {
it("load with immediate", () => {
const ssa: SSA = {
dest: {
type: "variable",
name: "x",
},
source: 42,
}
expect(prettyPrintIR(ssa)).to.equal("x = 42")
})
it("load with register", () => {
const ssa: SSA = {
dest: {
type: "variable",
name: "x",
},
source: {
type: "register",
name: "A"
},
}
expect(prettyPrintIR(ssa)).to.equal("x = %A")
})
it("load with temporary", () => {
const ssa: SSA = {
dest: {
type: "variable",
name: "x",
},
source: {
type: "temporary",
name: "t0"
},
}
expect(prettyPrintIR(ssa)).to.equal("x = #t0")
})
it("load with variable", () => {
const ssa: SSA = {
dest: {
type: "variable",
name: "x",
},
source: {
type: "variable",
name: "y"
},
}
expect(prettyPrintIR(ssa)).to.equal("x = y")
})
it("unary op", () => {
const ssa: SSA = {
dest: {
type: "variable",
name: "x",
},
source: {
type: "variable",
name: "y"
},
op: "arith_negate",
}
expect(prettyPrintIR(ssa)).to.equal("x = arith_negate(y)")
})
it("binary op", () => {
const ssa: SSA = {
dest: {
type: "variable",
name: "x",
},
source: {
type: "variable",
name: "y"
},
source1: 42,
op: "add",
}
expect(prettyPrintIR(ssa)).to.equal("x = add(y, 42)")
})
})
})