Skip to content

Commit

Permalink
new test
Browse files Browse the repository at this point in the history
  • Loading branch information
winsvega committed Oct 21, 2024
1 parent a61c0d8 commit 069e2a8
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 2 deletions.
5 changes: 3 additions & 2 deletions .github/workflows/coverage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,8 @@ jobs:
mkdir -p fixtures/state_tests
mkdir -p fixtures/eof_tests
uv run fill $files -n auto --until=Cancun --evm-bin evmone-t8n || true >> filloutput.log 2>&1
echo "uv run fill $files --until=Cancun --evm-bin evmone-t8n >> filloutput.log 2>&1"
uv run fill $files --until=Cancun --evm-bin evmone-t8n >> filloutput.log 2>&1

if grep -q "FAILURES" filloutput.log; then
echo "Error: failed to generate .py tests."
Expand Down Expand Up @@ -229,7 +230,7 @@ jobs:
mkdir -p fixtures/eof_tests
if [ -n "$files_fixed" ]; then
uv run fill $files_fixed -n auto --until=Cancun --evm-bin evmone-t8n || true >> filloutput.log 2>&1
uv run fill $files_fixed --until=Cancun --evm-bin evmone-t8n >> filloutput.log 2>&1
if grep -q "FAILURES" filloutput.log; then
echo "Error: failed to generate .py tests from before the PR."
Expand Down
105 changes: 105 additions & 0 deletions tests/frontier/opcodes/test_newl.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
"""
abstract: Test DUP
Test the DUP opcodes.
"""

import pytest

from ethereum_test_forks import Frontier, Homestead
from ethereum_test_tools import Account, Alloc, Environment
from ethereum_test_tools import Opcodes as Op
from ethereum_test_tools import StateTestFiller, Storage, Transaction


@pytest.mark.parametrize(
"dup_opcode",
[
Op.DUP1,
Op.DUP2,
Op.DUP3,
Op.DUP4,
Op.DUP5,
Op.DUP6,
Op.DUP7,
Op.DUP8,
Op.DUP9,
Op.DUP10,
Op.DUP11,
Op.DUP12,
Op.DUP13,
Op.DUP14,
Op.DUP15,
Op.DUP16,
],
ids=lambda op: str(op),
)
@pytest.mark.with_all_evm_code_types
def test_newl(
state_test: StateTestFiller,
fork: str,
dup_opcode: Op,
pre: Alloc,
):
"""
Test the DUP1-DUP16 opcodes.
Note: Test case ported from [ethereum/tests](https://github.com/ethereum/tests)
Test ported from [ethereum/tests/GeneralStateTests/VMTests/vmTests/dup.json](https://github.com/ethereum/tests/blob/develop/GeneralStateTests/VMTests/vmTests/dup.json) by Ori Pomerantz.
""" # noqa: E501
env = Environment()
sender = pre.fund_eoa()
post = {}

# Push 0x00 - 0x10 onto the stack
account_code = sum(Op.PUSH1(i) for i in range(0x11))

# Use the DUP opcode
account_code += dup_opcode

# Save each stack value into different keys in storage
account_code += sum(Op.PUSH1(i) + Op.SSTORE for i in range(0x11))

account = pre.deploy_contract(account_code)

tx = Transaction(
ty=0x0,
nonce=0,
to=account,
gas_limit=500000,
gas_price=10,
protected=False if fork in [Frontier, Homestead] else True,
data="",
sender=sender,
)

"""
Storage will be structured as follows:
0x00: 0x10-0x01 (Depending on DUP opcode)
0x01: 0x10
0x02: 0x0F
0x03: 0x0E
0x04: 0x0D
0x05: 0x0C
0x06: 0x0B
0x07: 0x0A
0x08: 0x09
0x09: 0x08
0x0A: 0x07
0x0B: 0x06
0x0C: 0x05
0x0D: 0x04
0x0E: 0x03
0x0F: 0x02
0x10: 0x01
DUP1 copies the first element of the stack (0x10).
DUP16 copies the 16th element of the stack (0x01).
"""
s: Storage.StorageDictType = dict(zip(range(1, 17), range(16, 0, -1)))
s[0] = 16 - (dup_opcode.int() - 0x80)

post[account] = Account(storage=s)

state_test(env=env, pre=pre, post=post, tx=tx)

0 comments on commit 069e2a8

Please sign in to comment.