#!/usr/bin/env python3

"""Tests covering the Ichor ISA and state model."""

from ichor.interpreter import Stackframe
import pytest


@pytest.fixture
def frame():
    return Stackframe(None, 0)


def test_stackframe_lifo(frame):
    frame.push(0)
    frame.push(1)
    frame.push(2)
    assert frame.pop() == 2
    assert frame.pop() == 1
    assert frame.pop() == 0


def test_stackframe_dup(frame):
    frame.push(0)
    frame.push(1)
    frame.push(2)
    frame.push(3)
    frame.push(4)

    frame.dup(1)
    assert len(frame) == 6
    assert frame.pop() == 4
    assert frame.pop() == 4

    frame.dup(2)
    assert frame.pop() == 3
    assert frame.pop() == 2
    assert frame.pop() == 3
    assert frame.pop() == 2


def test_stackframe_drop(frame):
    frame.push(0)
    frame.push(1)
    frame.push(2)
    frame.push(3)
    frame.push(4)

    assert len(frame) == 5

    frame.drop(2)
    assert len(frame) == 3
    assert frame.pop() == 2


def test_stackframe_slot(frame):
    frame.push(0)
    frame.push(1)
    frame.push(2)
    frame.push(3)
    frame.push(4)

    frame.slot(0)
    assert frame.pop() == 0

    frame.slot(1)
    assert frame.pop() == 1

    frame.slot(2)
    assert frame.pop() == 2


def test_stackframe_rot(frame):
    frame.push(0)
    frame.push(1)
    frame.push(2)
    frame.push(3)
    frame.push(4)

    frame.rot(2)
    assert frame.pop() == 3
    assert frame.pop() == 4