class TestFutures:
# тут вопросов нет
def test_future_task_construction(self):
program = RplTestProgram(
test_actor_contents="""\
""",
main_body="""\
const A = shell: int { yield 42; }; /// A: task[int]
const B = shell: int? { yield nil; }; /// B: task[int?]
const C = shell: bool? { yield nil; }; /// C: task[bool?]
const D = shell: bool { yield true; }; /// D: task[bool]
const E = shell { yield; }; /// E: task
discard B;
discard C;
discard D;
discard E;
const Y = shell: int? {
if ((wait A) % 2 == 0)
yield 2025; /// task gets to the Ready state with the value = 2025
else
yield nil; /// task gets to the Ready state with the value = nil
};
// Testing.message(f"Y's state is {Y}");
// Testing.message(f"Y's value is {wait Y}"); /// Y is in Ready state here
Testing.complete();
"""
)
check_compile_success(program)
check_run_result(program)
def test_future_task_internal_compiler_error(self):
# FUTURE: Почему InternalError, а не успешная компиляция?
"""В этом тесте я хочу собрать task и task[int?] и вернуть его результатом функции."""
program_typeless_task = RplTestProgram(
test_actor_contents="""\
def compute(): task {
return shell { yield; };
}
""",
main_body="""\
discard compute();
Testing.complete();
"""
)
check_compile_issues(program_typeless_task, IssueCode.E_InternalError)
program_typed_task = RplTestProgram(
test_actor_contents="""\
def compute(condition: bool): task[int?] {
return shell: int? {
if (condition)
yield 42;
else
yield nil;
};
}
""",
main_body="""\
discard compute(true);
Testing.complete();
"""
)
check_compile_issues(program_typed_task, IssueCode.E_InternalError)
# тут вопросов нет
def test_future_task_automatic_type_cast_failed(self):
program = RplTestProgram(
test_actor_contents="""\
def compute(condition: bool): int? {
return wait shell: int? {
if (condition)
yield 42;
else
yield nil;
};
}
""",
main_body="""\
discard compute(true);
Testing.complete();
"""
)
check_compile_success(program)
def test_standard_future_library(self):
# FUTURE: Как у task получить статус Failed?
"""Правильно ли, что при панике из под шелла должен крашиться весь рантайм?
В чем тогда смысл изоляции? Как достигается атомарность?
"""
program = RplTestProgram(
main_body="""\
// Task A status: Pending
const A = shell: int { yield 42; };
assert pending(A) == true, "Task should be Pending";
assert ready(A) == false, "Task should be Pending, not Ready";
assert failed(A) == false, "Task should be Pending, not Failed";
// Task B status: Failed?
const B = shell {
assert false, "panic in the shell"; // runtime is dead
yield;
};
Testing.complete();
"""
)
check_compile_success(program)
check_run_result(program)