Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 0 additions & 20 deletions tests/runtime/compiled.py → src/mccode_antlr/test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from __future__ import annotations
from functools import cache
from mccode_antlr import Flavor
import pytest

from mccode_antlr.compiler.check import simple_instr_compiles
Expand Down Expand Up @@ -45,22 +44,3 @@ def no_cc(*args, **kwargs):
return method(*args, **kwargs)
return method


def compile_and_run(instr,
parameters,
run=True,
dump_source=True,
target: dict | None = None,
config: dict | None = None,
flavor: Flavor = Flavor.MCSTAS):
from pathlib import Path
from tempfile import TemporaryDirectory
from mccode_antlr.run import mccode_compile, mccode_run_compiled

kwargs = dict(target=target, config=config, dump_source=dump_source)

with TemporaryDirectory() as directory:
binary, target = mccode_compile(instr, directory, flavor=flavor, **kwargs)
# The runtime output directory used *can not* exist for McStas/McXtrace to work properly.
# So find a name inside this directory that doesn't exist (any name should work)
return mccode_run_compiled(binary, target, Path(directory).joinpath('t'), parameters) if run else (None, None)
38 changes: 37 additions & 1 deletion src/mccode_antlr/utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
from __future__ import annotations

from mccode_antlr import Flavor

def run_prog_message_output(prog: list[str]):
"""Run a program and return its output

Expand All @@ -24,4 +28,36 @@ def run_prog_message_output(prog: list[str]):
else:
message = f'{prog[0]} not found'

return message, output
return message, output


def make_assembler(name: str, flavor: Flavor = Flavor.MCSTAS):
from mccode_antlr.assembler import Assembler
from mccode_antlr.reader.registry import default_registries
return Assembler(name, registries=default_registries(flavor))


def parse_instr_string(instr_source: str):
from mccode_antlr.loader import parse_mcstas_instr
return parse_mcstas_instr(instr_source)



def compile_and_run(instr,
parameters,
run=True,
dump_source=True,
target: dict | None = None,
config: dict | None = None,
flavor: Flavor = Flavor.MCSTAS):
from pathlib import Path
from tempfile import TemporaryDirectory
from mccode_antlr.run import mccode_compile, mccode_run_compiled

kwargs = dict(target=target, config=config, dump_source=dump_source)

with TemporaryDirectory() as directory:
binary, target = mccode_compile(instr, directory, flavor=flavor, **kwargs)
# The runtime output directory used *can not* exist for McStas/McXtrace to work properly.
# So find a name inside this directory that doesn't exist (any name should work)
return mccode_run_compiled(binary, target, Path(directory).joinpath('t'), parameters) if run else (None, None)
4 changes: 2 additions & 2 deletions tests/instr/test_copy.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from unittest import TestCase
from .utils import parse_instr_string


class TestInstrCopy(TestCase):
def test_copy(self):
from mccode_antlr.instr import Instr
from mccode_antlr.common import InstrumentParameter, Expr, Value, DataType
from mccode_antlr.common import InstrumentParameter, Expr
from mccode_antlr.utils import parse_instr_string
instr_source = """
DEFINE INSTRUMENT test_copy(par0=3.14159, double par1 = 49, int par2 = 1010110
, string par3="this is a long string with spaces",
Expand Down
2 changes: 1 addition & 1 deletion tests/instr/test_empty_trace.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from unittest import TestCase
from .utils import make_assembler


class TestInstrEmptyTrace(TestCase):
Expand Down Expand Up @@ -32,6 +31,7 @@ def test_parse_empty_trace(self):
def test_assemble_empty_trace(self):
from mccode_antlr.instr import Instr
from mccode_antlr.common import InstrumentParameter, Expr, Value, DataType
from mccode_antlr.utils import make_assembler

assembler = make_assembler('test_assemble')

Expand Down
3 changes: 1 addition & 2 deletions tests/instr/test_instance_parameters.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from unittest import TestCase
from loguru import logger
from .utils import make_assembler



class TestInstrInstanceParameters(TestCase):
def test_assemble_identifier_instance_parameter(self):
from mccode_antlr.utils import make_assembler
assembler = make_assembler('fake_bifrost')

parameters = [
Expand Down
6 changes: 5 additions & 1 deletion tests/instr/test_positioning.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from unittest import TestCase
from .utils import make_assembler, parse_instr_string


class TestInstrPositioning(TestCase):
Expand Down Expand Up @@ -38,6 +37,8 @@ def _positioning_evaluator(self, instr):
self.assertEqual(v5, last.orientation.position() - up.orientation.position())

def test_assemble_positioning(self):
from mccode_antlr.utils import make_assembler

"""Equivalent test to `test_read_positioning` but using an assembled instrument"""
assembler = make_assembler('orientation_test')
origin = assembler.component("origin", "Progress_bar", at=[0, 0, 0])
Expand All @@ -47,6 +48,8 @@ def test_assemble_positioning(self):
self._positioning_evaluator(assembler.instrument)

def test_read_positioning(self):
from mccode_antlr.utils import parse_instr_string

"""Equivalent test to `test_assemble_positioning` but using a parsed instrument"""
instr_source = """DEFINE INSTRUMENT orientation_test() TRACE
COMPONENT origin = Arm() AT (0, 0, 0) ABSOLUTE
Expand All @@ -66,6 +69,7 @@ def _simple_position_tests(self, instr, positions: dict):
self.assertEqual(positions[instance.name], instance.orientation.position('coordinates'))

def test_simple_positioning(self):
from mccode_antlr.utils import parse_instr_string

from math import pi, cos, sin
instr_source = """DEFINE INSTRUMENT simple_test() TRACE
Expand Down
5 changes: 4 additions & 1 deletion tests/instr/test_split.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from unittest import TestCase
from .utils import parse_instr_string

from mccode_antlr.instr import Instr, Instance
from mccode_antlr.common.expression import Expr
Expand All @@ -8,6 +7,8 @@

class TestInstrSplit(TestCase):
def test_mcpl_split(self):
from mccode_antlr.utils import parse_instr_string

instr_source = """
DEFINE INSTRUMENT test_copy()
TRACE
Expand Down Expand Up @@ -52,6 +53,8 @@ def test_mcpl_split(self):
self.assertEqual(before.get_component('second').rotate_relative[1], first)

def test_split_broken_reference(self):
from mccode_antlr.utils import parse_instr_string

from textwrap import dedent
instr = dedent("""\
DEFINE INSTRUMENT test_tof(phase/"degree"=0)
Expand Down
11 changes: 0 additions & 11 deletions tests/instr/utils.py

This file was deleted.

7 changes: 6 additions & 1 deletion tests/runtime/test_c_runtime.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import unittest
from textwrap import dedent
from mccode_antlr.loader import parse_mcstas_instr
from .compiled import compile_and_run, compiled_test, gpu_compiled_test
from mccode_antlr.test import compiled_test, gpu_compiled_test


class CRuntimeTestCase(unittest.TestCase):
def _do_trace_tests(self, with_acc):
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent(
"""\
DEFINE INSTRUMENT test_component_traces_visited()
Expand Down Expand Up @@ -37,6 +38,7 @@ def test_funnel_raytrace_traces_visited(self):
self._do_trace_tests(with_acc=True)

def _do_jump_tests(self, contents: str, jumps: int):
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(contents)
results, data = compile_and_run(instr, f"-n 1 jumps={jumps}")
lines = results.decode('utf-8').splitlines()
Expand Down Expand Up @@ -77,6 +79,7 @@ def test_jump_when(self):

@compiled_test
def test_split(self):
from mccode_antlr.utils import compile_and_run
contents = dedent("""\
define instrument test_split(int splits) trace
component a = Arm() AT (0,0,0) ABSOLUTE EXTEND %{printf("a\\n");%}
Expand All @@ -98,6 +101,7 @@ def test_split(self):

@compiled_test
def test_when(self):
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent("""\
define instrument test_when(dummy)
declare %{int count;%}
Expand All @@ -117,6 +121,7 @@ def test_when(self):

@compiled_test
def test_group(self):
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent("""\
define instrument test_group(dummy)
declare %{int count;%}
Expand Down
9 changes: 8 additions & 1 deletion tests/runtime/test_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
from mccode_antlr.loader.loader import parse_mcstas_instr
from textwrap import dedent

from .compiled import compile_and_run, compiled_test
from mccode_antlr.test import compiled_test


@compiled_test
def test_without_components():
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent("""\
DEFINE INSTRUMENT without_components(int dummy=0)
DECLARE %{
Expand All @@ -34,6 +35,7 @@ def test_template_instr():
"""
This test failed previously because its name is a reserved word in C++ (template)
"""
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent("""\
DEFINE INSTRUMENT template(Par1=1)
DECLARE %{ %}
Expand All @@ -53,6 +55,7 @@ def test_template_instr():
reason='This test fails to compile on Windows due to https://github.com/McStasMcXtrace/McCode/issues/1817'
)
def test_component_declare_variable_initialised():
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent("""\
DEFINE INSTRUMENT namedsomething(dummy=0)
DECLARE %{
Expand All @@ -72,6 +75,7 @@ def test_component_declare_variable_initialised():

@compiled_test
def test_function_pointer_declare_parameter():
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent("""\
DEFINE INSTRUMENT with_function_pointers(int which=0)
DECLARE %{
Expand Down Expand Up @@ -119,6 +123,7 @@ def test_function_pointer_declare_parameter():

@compiled_test
def test_function_pointer_component_declare_parameter():
from mccode_antlr.utils import compile_and_run
from mccode_antlr.reader.registry import InMemoryRegistry
in_memory_registry = InMemoryRegistry('test_components')
comp_name = 'declares_function_pointer'
Expand Down Expand Up @@ -185,6 +190,7 @@ def test_function_pointer_component_declare_parameter():

@compiled_test
def test_struct_instance_parameter():
from mccode_antlr.utils import compile_and_run
instr = parse_mcstas_instr(dedent(r"""
DEFINE INSTRUMENT test_template_TAS(DM=3.3539)
DECLARE
Expand Down Expand Up @@ -245,6 +251,7 @@ def test_struct_instance_parameter():

@compiled_test
def test_copy_extend_instance_parameter():
from mccode_antlr.utils import compile_and_run
from mccode_antlr.reader.registry import InMemoryRegistry
in_memory_registry = InMemoryRegistry('test_components')
comp_name = 'has_parameter'
Expand Down
3 changes: 2 additions & 1 deletion tests/runtime/test_instr.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from unittest import TestCase
from loguru import logger
from .compiled import compiled_test, mcpl_compiled_test, compile_and_run
from mccode_antlr.test import compiled_test, mcpl_compiled_test
from mccode_antlr.utils import compile_and_run
from mccode_antlr import Flavor

class TestCompiledInstr(TestCase):
Expand Down
3 changes: 2 additions & 1 deletion tests/runtime/test_mcxtrace.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from textwrap import dedent
from mccode_antlr.loader import parse_mcstas_instr, parse_mcxtrace_instr
from .compiled import compiled_test, compile_and_run, Flavor
from mccode_antlr.test import compiled_test
from mccode_antlr.utils import compile_and_run, Flavor
from mccode_antlr.reader.registry import InMemoryRegistry

in_memory = InMemoryRegistry(
Expand Down
3 changes: 2 additions & 1 deletion tests/runtime/test_multiple_copy.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from textwrap import dedent
from mccode_antlr.loader import parse_mcstas_instr
from .compiled import compiled_test, compile_and_run
from mccode_antlr.test import compiled_test
from mccode_antlr.utils import compile_and_run
from mccode_antlr.reader.registry import InMemoryRegistry


Expand Down
3 changes: 2 additions & 1 deletion tests/runtime/test_nexus.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from textwrap import dedent
from mccode_antlr.loader import parse_mcstas_instr
from .compiled import compiled_test, compile_and_run
from mccode_antlr.test import compiled_test
from mccode_antlr.utils import compile_and_run
from mccode_antlr.reader.registry import InMemoryRegistry


Expand Down
3 changes: 2 additions & 1 deletion tests/runtime/test_parameters.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .compiled import compile_and_run, compiled_test
from mccode_antlr.test import compiled_test
from mccode_antlr.utils import compile_and_run

@compiled_test
def test_parameters():
Expand Down
4 changes: 2 additions & 2 deletions tests/runtime/test_raytrace.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from textwrap import dedent
from mccode_antlr.loader import parse_mcstas_instr
from .compiled import compiled_test, gpu_compiled_test, compile_and_run
from mccode_antlr.config import config
from mccode_antlr.test import gpu_compiled_test
from mccode_antlr.utils import compile_and_run
from mccode_antlr.reader.registry import InMemoryRegistry


Expand Down
3 changes: 2 additions & 1 deletion tests/runtime/test_when.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from textwrap import dedent
from mccode_antlr.loader import parse_mcstas_instr
from .compiled import compiled_test, compile_and_run
from mccode_antlr.test import compiled_test
from mccode_antlr.utils import compile_and_run

@compiled_test
def test_when_logical_parses():
Expand Down
2 changes: 1 addition & 1 deletion tests/test_component_vector_parameter.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import unittest

from tests.runtime.compiled import compiled_test
from mccode_antlr.test import compiled_test

FAKE_COMPONENTS = dict(component_with_vector_parameter="""
DEFINE COMPONENT component_with_vector_parameter
Expand Down