Files
templates/tools/dsview/tests/test_scope_demo.py
T

18 lines
3.3 KiB
Python

"""Нативная проверка напряжений, фазы и сохранения экстремумов эмулятора Zynq.""" # Тест использует производственный заголовок без отдельной реализации генератора.
import os # Путь к DLL компилятора задаётся только дочернему проверочному процессу.
from pathlib import Path # Пути вычисляются относительно переносимого рецепта DSView.
import shutil # Системный компилятор обнаруживается без установки новых зависимостей.
import subprocess # Настоящая C++-модель компилируется и исполняется в отдельном процессе.
import tempfile # Исполняемые артефакты не попадают в исходники рецепта.
import unittest # Проверка включается в существующий набор тестов templates.
class ScopeDemoTests(unittest.TestCase): # Один нативный сценарий проверяет все четыре канала и крайние случаи времени.
def test_native_signal_and_envelope(self): # Числовые утверждения выполняются компилятором того же семейства, что сборка DSView.
compiler = shutil.which('g++') or ('C:/msys64/ucrt64/bin/g++.exe' if Path('C:/msys64/ucrt64/bin/g++.exe').is_file() else None) # Используем уже установленный C++ SDK, не меняя настройки компьютера.
if not compiler: self.skipTest('Для нативной проверки нужен компилятор g++') # Отсутствие необязательного SDK явно видно в результате тестирования.
here = Path(__file__).resolve().parent # Исходник проверки и производственный заголовок принадлежат одному checkout.
environment = dict(os.environ, PATH=str(Path(compiler).parent) + os.pathsep + os.environ.get('PATH', '')) # Windows находит DLL UCRT64 без копирования в системные каталоги.
with tempfile.TemporaryDirectory(prefix='scope-demo-') as temporary: # Каждый запуск получает собственный исполняемый файл.
executable = Path(temporary) / ('scope-test.exe' if os.name == 'nt' else 'scope-test') # Расширение соответствует платформе проверочного процесса.
subprocess.run([compiler, '-std=c++11', '-O2', '-I', str(here.parent / 'native'), str(here / 'scope_demo_test.cpp'), '-o', str(executable)], env=environment, check=True, capture_output=True) # Проверяем компиляцию модели без Qt и аппаратных библиотек.
subprocess.run([str(executable)], env=environment, check=True, capture_output=True) # Ненулевой код любого числового утверждения становится провалом теста.