diff --git a/тесты/kvs_full_test.csv b/тесты/kvs_full_test.csv index 841443a..ccb7d01 100644 --- a/тесты/kvs_full_test.csv +++ b/тесты/kvs_full_test.csv @@ -23,4 +23,5 @@ 1;двоеточие_в_строке;Проверка обработки строк с двоеточием внутри 1;тест_адресации_р12;Проверка косвенной адресации через R12 (ASCII код первого символа аргумента) 1;вызов_функции;Проверка вызова функций и возврата: сложение 10+20=30 через код возврата -1;остаток_от_деления;Проверка деления и получения остатка: 42 % 10 = 2 (проверка через код возврата) \ No newline at end of file +1;остаток_от_деления;Проверка деления и получения остатка: 42 % 10 = 2 (проверка через код возврата) +1;вывод_однозначного;Проверка вывода однозначного числа: цифра 7 → символ '7' через write \ No newline at end of file diff --git a/тесты/вывод_однозначного/вывод_однозначного.py b/тесты/вывод_однозначного/вывод_однозначного.py new file mode 100644 index 0000000..2992e2e --- /dev/null +++ b/тесты/вывод_однозначного/вывод_однозначного.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Тест для проверки вывода однозначного числа +Преобразует цифру 7 в символ '7' и выводит через write +""" + +import subprocess +import sys +import os +from pathlib import Path + +# Определяем пути +SCRIPT_DIR = Path(__file__).parent.absolute() +PROJECT_ROOT = SCRIPT_DIR.parent.parent +SOURCE_REL = SCRIPT_DIR / "вывод_однозначного.квс" + +def clean(): + """Очищает артефакты сборки""" + files = [ + "вывод_однозначного.elf", + "вывод_однозначного.csv", + "вывод_однозначного.аст", + "вывод_однозначного.токены", + "вывод_однозначного.константа", + "вывод_однозначного_pass4.log" + ] + for f in files: + f_path = SCRIPT_DIR / f + if f_path.exists(): + f_path.unlink() + print(f"DEBUG: Удалён {f}", file=sys.stderr) + +def build() -> bool: + """Собирает тестовую программу с помощью КВС""" + print(f"DEBUG: Сборка {SOURCE_REL}", file=sys.stderr) + os.chdir(PROJECT_ROOT) + + build = subprocess.run( + ["python3", "квс_сборка.py", str(SOURCE_REL)], + capture_output=True, + text=True + ) + + if build.returncode != 0: + print(f"❌ Ошибка сборки: {build.returncode}", file=sys.stderr) + print(build.stderr, file=sys.stderr) + return False + + print("DEBUG: Сборка успешна", file=sys.stderr) + return True + +def test_output() -> bool: + """Запускает программу и проверяет вывод""" + print("DEBUG: Запуск ELF, ожидается вывод '7'", file=sys.stderr) + os.chdir(SCRIPT_DIR) + + elf_path = SCRIPT_DIR / "вывод_однозначного.elf" + if not elf_path.exists(): + print("❌ ELF файл не найден", file=sys.stderr) + return False + + run = subprocess.run( + [str(elf_path)], + capture_output=True, + text=True + ) + + expected_output = "7" + + if run.stdout != expected_output: + print(f"❌ Вывод не совпадает", file=sys.stderr) + print(f" Ожидалось: {repr(expected_output)}", file=sys.stderr) + print(f" Получено: {repr(run.stdout)}", file=sys.stderr) + return False + + if run.returncode != 0: + print(f"❌ Код возврата: ожидался 0, получен {run.returncode}", file=sys.stderr) + return False + + print(f"DEBUG: Тест пройден (вывод '{run.stdout}', код {run.returncode})", file=sys.stderr) + return True + +def main(): + """Главная функция теста""" + print("DEBUG: Начало теста вывод_однозначного", file=sys.stderr) + + if not build(): + clean() + sys.exit(1) + + if not test_output(): + clean() + sys.exit(1) + + clean() + print("✅ Все тесты пройдены!", file=sys.stderr) + sys.exit(0) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/тесты/вывод_однозначного/вывод_однозначного.квс b/тесты/вывод_однозначного/вывод_однозначного.квс new file mode 100644 index 0000000..b2d613a --- /dev/null +++ b/тесты/вывод_однозначного/вывод_однозначного.квс @@ -0,0 +1,35 @@ +;./тесты/вывод_однозначного/вывод_однозначного.elf +; Ожидаемый вывод: "7" + +; ============================================================ +; вывод_однозначного.квс - вывод однозначного числа без циклов +; Преобразует цифру 7 в символ '7' через сложение с '0' +; ============================================================ + +.текст +.глобал _start + +_start: + ; Загружаем цифру для вывода + переместить_имм раикс, 7 ; цифра 7 + + ; Преобразуем цифру в ASCII-символ: '0' = 48 + прибавить_непосредственно раикс, 48 ; RAX = 7 + 48 = 55 = '7' + + ; Сохраняем символ в буфер + сохранить [буфер], ал ; записываем байт '7' в буфер + + ; Системный вызов write(1, буфер, 1) + переместить_имм раикс, 1 ; номер syscall write = 1 + переместить_имм рдиай, 1 ; stdout = 1 + переместить_имм рсиай, буфер ; указатель на буфер + переместить_имм рдикс, 1 ; длина = 1 байт + вызов_системы + + ; Системный вызов exit(0) + переместить_имм раикс, 60 ; номер syscall exit = 60 + переместить_имм рдиай, 0 ; код возврата = 0 + вызов_системы + +.данные +буфер: .байт 0 \ No newline at end of file