Files
mercury/tests/hard_coded/try_syntax_6.m
Zoltan Somogyi 33eb3028f5 Clean up the tests in half the test directories.
tests/accumulator/*.m:
tests/analysis_*/*.m:
tests/benchmarks*/*.m:
tests/debugger*/*.{m,exp,inp}:
tests/declarative_debugger*/*.{m,exp,inp}:
tests/dppd*/*.m:
tests/exceptions*/*.m:
tests/general*/*.m:
tests/grade_subdirs*/*.m:
tests/hard_coded*/*.m:
    Make these tests use four-space indentation, and ensure that
    each module is imported on its own line. (I intend to use the latter
    to figure out which subdirectories' tests can be executed in parallel.)

    These changes usually move code to different lines. For the debugger tests,
    specify the new line numbers in .inp files and expect them in .exp files.
2015-02-14 20:14:03 +11:00

172 lines
3.6 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% Nested try goals.
:- module try_syntax_6.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- import_module exception.
%---------------------------------------------------------------------------%
main(!IO) :-
io.write_string("test_1:\n", !IO),
test_1(!IO),
io.write_string("\ntest_2:\n", !IO),
test_2(!IO),
io.write_string("\ntest_3:\n", !IO),
test_3(!IO),
io.write_string("\ntest_4:\n", !IO),
test_4,
io.write_string("\ntest_5:\n", !IO),
test_5(!IO).
% Nesting in try goal.
%
:- pred test_1(io::di, io::uo) is cc_multi.
test_1(!IO) :-
( try []
( try []
throw(3)
then
true
catch 4 ->
trace [io(!TIO)] (
io.write_string("caught 4 (WRONG)\n", !TIO)
)
)
then
true
else
true
catch 3 ->
io.write_string("caught 3 (RIGHT)\n", !IO)
).
% Nesting in then part.
%
:- pred test_2(io::di, io::uo) is cc_multi.
test_2(!IO) :-
( try []
(try []
true
then
( try []
throw(3)
then
true
catch 4 ->
trace [io(!TIO)] (
io.write_string("caught 4 (WRONG)\n", !TIO)
)
)
else
true
catch 3 ->
trace [io(!TIO)] (
io.write_string("caught 3 in middle try (WRONG)\n", !TIO)
)
)
then
true
catch 3 ->
io.write_string("caught 3 in outer try (RIGHT)\n", !IO)
).
% Nesting in else part.
%
:- pred test_3(io::di, io::uo) is cc_multi.
test_3(!IO) :-
( try []
( try []
fail
then
true % unreachable
else
% Nesting in else part.
(try []
throw(1) % should NOT be caught by the outer try
then
true
)
catch 1 ->
trace [io(!TIO)] (
io.write_string("caught 1 in inner try (WRONG)\n", !TIO)
)
)
then
true
catch 1 ->
io.write_string("caught 1 in outer try (RIGHT)\n", !IO)
).
% Nesting in catch part.
:- pred test_4 is det.
test_4 :-
( try []
( try []
throw(1)
then
true
catch 1 ->
(try []
throw(1)
then
true % unreachable
catch 1 ->
trace [io(!IO)] (
io.write_string("caught 1 in inner try (RIGHT)\n", !IO)
),
throw(2)
)
catch 2 ->
trace [io(!IO)] (
io.write_string("caught 2 in middle try (WRONG)\n", !IO)
)
)
then
true
catch 2 ->
trace [io(!IO)] (
io.write_string("caught 2 in outer try (RIGHT)\n", !IO)
)
).
% Nesting in catch_any part.
%
:- pred test_5(io::di, io::uo) is cc_multi.
test_5(!IO) :-
( try []
throw(1)
then
true
catch_any X ->
( try []
throw(X)
then
true
catch 1 ->
io.write_string("caught 1 (RIGHT)\n", !IO)
)
).