#!/usr/bin/env python3

from ichor import isa
from ichor.assembler import FuncBuilder
import pytest


@pytest.fixture
def builder() -> FuncBuilder:
    return FuncBuilder()


def test_forwards_label(builder: FuncBuilder):
    l = builder.make_label()
    builder.write(isa.GOTO(l))
    builder.write(isa.DROP(0)) # no-op
    builder.write(l)
    builder.write(isa.DROP(0)) # no-op
    instrs = builder.build()
    assert instrs == [
        isa.GOTO(2),
        isa.DROP(0),
        isa.DROP(0),
    ]


def test_backwards_label(builder: FuncBuilder):
    l = builder.make_label()
    builder.write(l)
    builder.write(isa.DROP(0)) # no-op
    builder.write(isa.GOTO(l))
    instrs = builder.build()
    assert instrs == [
        isa.DROP(0),
        isa.GOTO(0),
    ]


def test_self_label(builder: FuncBuilder):
    l = builder.make_label()
    builder.write(isa.DROP(0)) # no-op
    builder.write(l)
    builder.write(isa.GOTO(l))
    instrs = builder.build()
    assert instrs == [
        isa.DROP(0),
        isa.GOTO(1),
    ]


def test_local_label(builder: FuncBuilder):
    s0 = builder.mark_slot(target=0)
    builder.write(isa.SLOT(s0))

    s999 = builder.mark_slot(target=999)
    builder.write(isa.SLOT(s999))

    instrs = builder.build()
    assert instrs == [
        isa.SLOT(0),
        isa.SLOT(999),
    ]