Skip to content

Commit ee211b6

Browse files
authored
[SYCL] Move intel/llvm-test-suite SYCL tests to in-tree sycl/test-e2e
This PR was implemented using the following steps: 1) In intel/llvm: remove current limited subset of end-to-end tests in sycl/test-e2e/ directory 2) Create a fresh clone of intel/llvm-test-suite and filter it using https://github.com/newren/git-filter-repo with the following command: ``` git-filter-repo --path SYCL --message-callback 'return re.sub(b"\\(#([0-9]+)\\)", b"(intel/llvm-test-suite#\\1)", message)' ``` 3) In the filtered repo, perform ``` $ git mv SYCL sycl/test-e2e && git commit -m "Move SYCL -> sycl/test-e2e" ``` 4) Return back to intel/llvm, add filtered repo as a remote and merge it in. It resulted in two conflicts in `CMakeLists.txt` and `lit.site.cfg.py.in`. The resolution is to keep intel/llvm version with an additional change of uncommenting previously skipped `add_subdirectory(External)` and `add_subdirectory(ExtraTests)` in `CMakeLists.txt`. 5) Update `sycl/test-e2e/README.md`
2 parents 0922257 + 9fd0ee6 commit ee211b6

File tree

1,442 files changed

+927772
-15
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,442 files changed

+927772
-15
lines changed

sycl/test-e2e/AOT/accelerator.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//=-- accelerator.cpp - compilation for fpga emulator dev using opencl-aot --=//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===---------------------------------------------------------------------===//
8+
9+
// REQUIRES: opencl-aot, accelerator
10+
11+
// RUN: %clangxx -fsycl -fsycl-targets=spir64_fpga %S/Inputs/aot.cpp -o %t.out
12+
// RUN: %ACC_RUN_PLACEHOLDER %t.out
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "kernels_in_file2.hpp"
2+
3+
#ifdef DEFINE_NDEBUG_INFILE2
4+
#define NDEBUG
5+
#else
6+
#undef NDEBUG
7+
#endif
8+
9+
#include <cassert>
10+
11+
using namespace sycl;
12+
using namespace sycl::access;
13+
14+
int calculus(int X) {
15+
assert(X && "this message from calculus");
16+
return X * 2;
17+
}
18+
19+
void check_nil(int value) { assert(value && "this message from file2"); }
20+
21+
static constexpr size_t BUFFER_SIZE = 4;
22+
23+
void enqueueKernel_1_fromFile2(queue *Q) {
24+
sycl::range<1> numOfItems{BUFFER_SIZE};
25+
sycl::buffer<int, 1> Buf(numOfItems);
26+
27+
Q->submit([&](handler &CGH) {
28+
auto Acc = Buf.template get_access<mode::read_write>(CGH);
29+
30+
CGH.parallel_for<class kernel1_from_separate_file>(
31+
numOfItems, [=](sycl::id<1> wiID) { check_nil(Acc[wiID]); });
32+
});
33+
}
34+
35+
void enqueueKernel_2_fromFile2(queue *Q) {
36+
sycl::range<1> numOfItems{BUFFER_SIZE};
37+
sycl::buffer<int, 1> Buf(numOfItems);
38+
39+
Q->submit([&](handler &CGH) {
40+
auto Acc = Buf.template get_access<mode::read_write>(CGH);
41+
42+
CGH.parallel_for<class kernel2_from_separate_file>(
43+
numOfItems, [=](sycl::id<1> wiID) { check_nil(Acc[wiID]); });
44+
});
45+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include <sycl/sycl.hpp>
2+
3+
SYCL_EXTERNAL int calculus(int X);
4+
5+
void enqueueKernel_1_fromFile2(sycl::queue *Q);
6+
7+
void enqueueKernel_2_fromFile2(sycl::queue *Q);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// REQUIRES: linux
2+
3+
// https://github.com/intel/llvm/issues/7634
4+
// UNSUPPORTED: hip
5+
6+
// RUN: %clangxx -DSYCL_FALLBACK_ASSERT=1 -fsycl -fsycl-targets=%sycl_triple %s -o %t.out
7+
// RUN: %CPU_RUN_PLACEHOLDER %t.out &> %t.cpu.txt || true
8+
// RUN: %CPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.cpu.txt
9+
// RUN: %GPU_RUN_PLACEHOLDER %t.out &> %t.gpu.txt || true
10+
// RUN: %GPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.gpu.txt
11+
// Shouldn't fail on ACC as fallback assert isn't enqueued there
12+
// RUN: %ACC_RUN_PLACEHOLDER %t.out &> %t.acc.txt
13+
// RUN: %ACC_RUN_PLACEHOLDER FileCheck %s --check-prefix=CHECK-ACC --input-file %t.acc.txt
14+
//
15+
// CHECK-NOT: One shouldn't see this message
16+
// CHECK: {{.*}}assert_in_kernels.hpp:25: void kernelFunc2(int *, int): {{.*}} [{{[0,2]}},0,0], {{.*}} [0,0,0]
17+
// CHECK-SAME: Assertion `Buf[wiID] == 0 && "from assert statement"` failed.
18+
// CHECK-NOT: test aborts earlier, one shouldn't see this message
19+
// CHECK-NOT: The test ended.
20+
//
21+
// CHECK-ACC-NOT: {{.*}}assert_in_kernels.hpp:25: void kernelFunc2(int *, int): {{.*}} [{{[0,2]}},0,0], {{.*}} [0,0,0]
22+
// CHECK-ACC: The test ended.
23+
24+
#include "assert_in_kernels.hpp"
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <cassert>
2+
#include <iostream>
3+
#include <sycl/sycl.hpp>
4+
5+
using namespace sycl;
6+
using namespace sycl::access;
7+
8+
void kernelFunc1(int *Buf, int wiID) {
9+
Buf[wiID] = 9;
10+
assert(Buf[wiID] != 0 && "One shouldn't see this message");
11+
}
12+
13+
void assertTest1(queue &Q, buffer<int, 1> &Buf) {
14+
Q.submit([&](handler &CGH) {
15+
auto Acc = Buf.template get_access<mode::read_write>(CGH);
16+
17+
CGH.parallel_for<class Kernel_1>(
18+
Buf.get_range(), [=](sycl::id<1> wiID) { kernelFunc1(&Acc[0], wiID); });
19+
});
20+
}
21+
22+
void kernelFunc2(int *Buf, int wiID) {
23+
if (wiID % 2 != 0)
24+
Buf[wiID] = 0;
25+
assert(Buf[wiID] == 0 && "from assert statement");
26+
}
27+
28+
void assertTest2(queue &Q, buffer<int, 1> &Buf) {
29+
Q.submit([&](handler &CGH) {
30+
auto Acc = Buf.template get_access<mode::read_write>(CGH);
31+
32+
CGH.parallel_for<class Kernel_2>(
33+
Buf.get_range(), [=](sycl::id<1> wiID) { kernelFunc2(&Acc[0], wiID); });
34+
});
35+
}
36+
37+
void kernelFunc3(int *Buf, int wiID) {
38+
if (wiID == 0)
39+
assert(false && "test aborts earlier, one shouldn't see this message");
40+
Buf[wiID] = 9;
41+
}
42+
43+
void assertTest3(queue &Q, buffer<int, 1> &Buf) {
44+
Q.submit([&](handler &CGH) {
45+
auto Acc = Buf.template get_access<mode::read_write>(CGH);
46+
47+
CGH.parallel_for<class Kernel_3>(
48+
Buf.get_range(), [=](sycl::id<1> wiID) { kernelFunc3(&Acc[0], wiID); });
49+
});
50+
}
51+
52+
int main(int Argc, const char *Argv[]) {
53+
std::array<int, 4> Vec = {1, 2, 3, 4};
54+
sycl::range<1> numOfItems{Vec.size()};
55+
sycl::buffer<int, 1> Buf(Vec.data(), numOfItems);
56+
57+
queue Q;
58+
assertTest1(Q, Buf);
59+
Q.wait();
60+
61+
assertTest2(Q, Buf);
62+
Q.wait();
63+
64+
assertTest3(Q, Buf);
65+
Q.wait();
66+
67+
std::cout << "The test ended." << std::endl;
68+
return 0;
69+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %clangxx -fsycl -fsycl-targets=%sycl_triple -DNDEBUG %S/assert_in_kernels.cpp -o %t.out
2+
// RUN: %CPU_RUN_PLACEHOLDER %t.out %CPU_CHECK_PLACEHOLDER
3+
// RUN: %GPU_RUN_PLACEHOLDER %t.out %GPU_CHECK_PLACEHOLDER
4+
// RUN: %ACC_RUN_PLACEHOLDER %t.out %ACC_CHECK_PLACEHOLDER
5+
//
6+
// CHECK-NOT: One shouldn't see this message
7+
// CHECK-NOT: from assert statement
8+
// CHECK-NOT: test aborts earlier, one shouldn't see this message
9+
// CHECK: The test ended.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// REQUIRES: windows
2+
// RUN: %clangxx -DSYCL_FALLBACK_ASSERT=1 -fsycl -fsycl-targets=%sycl_triple %s -o %t.out
3+
// RUN: %CPU_RUN_PLACEHOLDER %t.out &> %t.txt || true
4+
// RUN: %CPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.txt
5+
// RUN: %GPU_RUN_PLACEHOLDER %t.out &> %t.txt || true
6+
// RUN: %GPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.txt
7+
// Shouldn't fail on ACC as fallback assert isn't enqueued there
8+
// RUN: %ACC_RUN_PLACEHOLDER %t.out &> %t.txt
9+
// RUN: %ACC_RUN_PLACEHOLDER FileCheck %s --check-prefix=CHECK-ACC --input-file %t.txt
10+
//
11+
// CHECK-NOT: One shouldn't see this message
12+
// FIXME Windows version prints '(null)' instead of '<unknown func>' once in a
13+
// while for some insane reason.
14+
// CHECK: {{.*}}assert_in_kernels.hpp:25: {{<unknown func>|(null)}}: {{.*}} [{{[0,2]}},0,0], {{.*}} [0,0,0]
15+
// CHECK-SAME: Assertion `Buf[wiID] == 0 && "from assert statement"` failed.
16+
// CHECK-NOT: test aborts earlier, one shouldn't see this message
17+
// CHECK-NOT: The test ended.
18+
//
19+
// CHECK-ACC-NOT: {{.*}}assert_in_kernels.hpp:25: {{<unknown func>|(null)}}: {{.*}} [{{[0,2]}},0,0], {{.*}} [0,0,0]
20+
// CHECK-ACC: The test ended.
21+
22+
#include "assert_in_kernels.hpp"
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// REQUIRES: linux
2+
3+
// https://github.com/intel/llvm/issues/7634
4+
// UNSUPPORTED: hip
5+
6+
// RUN: %clangxx -DSYCL_FALLBACK_ASSERT=1 -fsycl -fsycl-targets=%sycl_triple -I %S/Inputs %s %S/Inputs/kernels_in_file2.cpp -o %t.out
7+
// RUN: %CPU_RUN_PLACEHOLDER %t.out &> %t.cpu.txt || true
8+
// RUN: %CPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.cpu.txt
9+
// RUN: %GPU_RUN_PLACEHOLDER %t.out &> %t.gpu.txt || true
10+
// RUN: %GPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.gpu.txt
11+
// Shouldn't fail on ACC as fallback assert isn't enqueued there
12+
// RUN: %ACC_RUN_PLACEHOLDER %t.out &> %t.acc.txt
13+
// RUN: %ACC_RUN_PLACEHOLDER FileCheck %s --check-prefix=CHECK-ACC --input-file %t.acc.txt
14+
//
15+
// CUDA uses block/thread vs global/local id for SYCL, also it shows the
16+
// position of a thread within the block, not the absolute ID.
17+
// CHECK: {{.*}}kernels_in_file2.cpp:15: int calculus(int): {{global id: \[5|block: \[1}},0,0], {{local id|thread}}: [1,0,0]
18+
// CHECK-SAME: Assertion `X && "this message from calculus"` failed.
19+
// CHECK-NOT: this message from file2
20+
// CHECK-NOT: The test ended.
21+
//
22+
// CHECK-ACC-NOT: {{.*}}kernels_in_file2.cpp:15: int calculus(int): global id: [5,0,0], local id: [1,0,0]
23+
// CHECK-ACC: The test ended.
24+
25+
#include "assert_in_multiple_tus.hpp"
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include "Inputs/kernels_in_file2.hpp"
2+
#include <iostream>
3+
#include <sycl/sycl.hpp>
4+
5+
#ifdef DEFINE_NDEBUG_INFILE1
6+
#define NDEBUG
7+
#else
8+
#undef NDEBUG
9+
#endif
10+
11+
#include <cassert>
12+
13+
using namespace sycl;
14+
using namespace sycl::access;
15+
16+
static constexpr size_t BUFFER_SIZE = 16;
17+
18+
int checkFunction() {
19+
int X = calculus(0);
20+
assert(X && "Nil in result");
21+
return X;
22+
}
23+
24+
void enqueueKernel_1_fromFile1(queue *Q) {
25+
sycl::range<1> numOfItems{BUFFER_SIZE};
26+
sycl::buffer<int, 1> Buf(numOfItems);
27+
28+
Q->submit([&](handler &CGH) {
29+
auto Acc = Buf.template get_access<mode::read_write>(CGH);
30+
31+
CGH.parallel_for<class Kernel_1>(
32+
sycl::nd_range(Buf.get_range(), sycl::range<1>(4)),
33+
[=](sycl::id<1> wiID) {
34+
int X = 0;
35+
if (wiID == 5)
36+
X = checkFunction();
37+
Acc[wiID] = X;
38+
});
39+
});
40+
}
41+
42+
int main(int Argc, const char *Argv[]) {
43+
44+
queue Q;
45+
enqueueKernel_1_fromFile1(&Q);
46+
enqueueKernel_2_fromFile2(&Q);
47+
Q.wait();
48+
49+
std::cout << "The test ended." << std::endl;
50+
return 0;
51+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// REQUIRES: linux
2+
3+
// https://github.com/intel/llvm/issues/7634
4+
// UNSUPPORTED: hip
5+
6+
// RUN: %clangxx -DSYCL_FALLBACK_ASSERT=1 -fsycl -fsycl-targets=%sycl_triple -DDEFINE_NDEBUG_INFILE2 -I %S/Inputs %S/assert_in_multiple_tus.cpp %S/Inputs/kernels_in_file2.cpp -o %t.out
7+
// RUN: %CPU_RUN_PLACEHOLDER %t.out &> %t.cpu.txt || true
8+
// RUN: %CPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.cpu.txt
9+
// RUN: %GPU_RUN_PLACEHOLDER %t.out &> %t.gpu.txt || true
10+
// RUN: %GPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.gpu.txt
11+
// Shouldn't fail on ACC as fallback assert isn't enqueued there
12+
// RUN: %ACC_RUN_PLACEHOLDER %t.out &> %t.acc.txt
13+
// RUN: %ACC_RUN_PLACEHOLDER FileCheck %s --check-prefix=CHECK-ACC --input-file %t.acc.txt
14+
//
15+
// CHECK-NOT: this message from calculus
16+
// CUDA uses block/thread vs global/local id for SYCL, also it shows the
17+
// position of a thread within the block, not the absolute ID.
18+
// CHECK: {{.*}}assert_in_multiple_tus.hpp:20: int checkFunction(): {{global id: \[5|block: \[1}},0,0],
19+
// CHECK-SAME: {{.*}} [1,0,0] Assertion `X && "Nil in result"` failed.
20+
// CHECK-NOT: this message from file2
21+
// CHECK-NOT: The test ended.
22+
//
23+
// CHECK-ACC-NOT: {{.*}}assert_in_multiple_tus.hpp:20: int checkFunction(): {{.*}}
24+
// CHECK-ACC: The test ended.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// REQUIRES: windows
2+
// RUN: %clangxx -DSYCL_FALLBACK_ASSERT=1 -fsycl -fsycl-targets=%sycl_triple -DDEFINE_NDEBUG_INFILE2 -I %S/Inputs %S/assert_in_multiple_tus.cpp %S/Inputs/kernels_in_file2.cpp -o %t.out
3+
// RUN: %CPU_RUN_PLACEHOLDER %t.out &> %t.txt || true
4+
// RUN: %CPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.txt
5+
// RUN: %GPU_RUN_PLACEHOLDER %t.out &> %t.txt || true
6+
// RUN: %GPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.txt
7+
// Shouldn't fail on ACC as fallback assert isn't enqueued there
8+
// RUN: %ACC_RUN_PLACEHOLDER %t.out &> %t.txt || true
9+
// RUN: %ACC_RUN_PLACEHOLDER FileCheck %s --check-prefix=CHECK-ACC --input-file %t.txt
10+
//
11+
// CHECK-NOT: this message from calculus
12+
// FIXME Windows version prints '(null)' instead of '<unknown func>' once in a
13+
// while for some insane reason.
14+
// CHECK: {{.*}}assert_in_multiple_tus.hpp:20: {{<unknown func>|(null)}}: {{.*}} [5,0,0],
15+
// CHECK-SAME: {{.*}} [1,0,0] Assertion `X && "Nil in result"` failed.
16+
// CHECK-NOT: this message from file2
17+
// CHECK-NOT: The test ended.
18+
//
19+
// CHECK-ACC-NOT: {{.*}}assert_in_multiple_tus.hpp:20: {{<unknown func>|(null)}}: {{.*}} [5,0,0],
20+
// CHECK-ACC: The test ended.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// REQUIRES: windows
2+
// RUN: %clangxx -DSYCL_FALLBACK_ASSERT=1 -fsycl -fsycl-targets=%sycl_triple -I %S/Inputs %s %S/Inputs/kernels_in_file2.cpp -o %t.out
3+
// RUN: %CPU_RUN_PLACEHOLDER %t.out &> %t.txt || true
4+
// RUN: %CPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.txt
5+
// RUN: %GPU_RUN_PLACEHOLDER %t.out &> %t.txt || true
6+
// RUN: %GPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.txt
7+
// Shouldn't fail on ACC as fallback assert isn't enqueued there
8+
// RUN: %ACC_RUN_PLACEHOLDER %t.out &> %t.txt
9+
// RUN: %ACC_RUN_PLACEHOLDER FileCheck %s --check-prefix=CHECK-ACC --input-file %t.txt
10+
//
11+
// FIXME Windows version prints '(null)' instead of '<unknown func>' once in a
12+
// while for some insane reason.
13+
// CHECK: {{.*}}kernels_in_file2.cpp:15: {{<unknown func>|(null)}}: {{.*}} [5,0,0], {{.*}} [1,0,0]
14+
// CHECK-SAME: Assertion `X && "this message from calculus"` failed.
15+
// CHECK-NOT: this message from file2
16+
// CHECK-NOT: The test ended.
17+
//
18+
// CHECK-ACC-NOT: {{.*}}kernels_in_file2.cpp:15: {{<unknown func>|(null)}}: {{.*}} [5,0,0], {{.*}} [1,0,0]
19+
// CHECK-ACC: The test ended.
20+
21+
#include "assert_in_multiple_tus.hpp"
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// REQUIRES: linux
2+
3+
// https://github.com/intel/llvm/issues/7634
4+
// UNSUPPORTED: hip
5+
6+
// RUN: %clangxx -DSYCL_FALLBACK_ASSERT=1 -fsycl -fsycl-targets=%sycl_triple %s -o %t.out
7+
// RUN: %CPU_RUN_PLACEHOLDER %t.out &> %t.cpu.txt || true
8+
// RUN: %CPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.cpu.txt
9+
// RUN: %GPU_RUN_PLACEHOLDER %t.out &> %t.gpu.txt || true
10+
// RUN: %GPU_RUN_PLACEHOLDER FileCheck %s --input-file %t.gpu.txt
11+
// Shouldn't fail on ACC as fallback assert isn't enqueued there
12+
// RUN: %ACC_RUN_PLACEHOLDER %t.out &> %t.acc.txt
13+
// RUN: %ACC_RUN_PLACEHOLDER FileCheck %s --check-prefix=CHECK-ACC --input-file %t.acc.txt
14+
//
15+
// CHECK: {{.*}}assert_in_one_kernel.hpp:10: void kernelFunc(int *, int): {{.*}} [{{[0-3]}},0,0], {{.*}} [0,0,0]
16+
// CHECK-SAME: Assertion `Buf[wiID] != 0 && "from assert statement"` failed.
17+
// CHECK-NOT: The test ended.
18+
//
19+
// CHECK-ACC-NOT: {{.*}}assert_in_one_kernel.hpp:10: void kernelFunc(int *, int): {{.*}} [{{[0-3]}},0,0], {{.*}} [0,0,0]
20+
// CHECK-ACC: The test ended.
21+
22+
#include "assert_in_one_kernel.hpp"
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <cassert>
2+
#include <iostream>
3+
#include <sycl/sycl.hpp>
4+
5+
using namespace sycl;
6+
using namespace sycl::access;
7+
8+
void kernelFunc(int *Buf, int wiID) {
9+
Buf[wiID] = 0;
10+
assert(Buf[wiID] != 0 && "from assert statement");
11+
}
12+
13+
void assertTest() {
14+
std::array<int, 4> Vec = {1, 2, 3, 4};
15+
sycl::range<1> numOfItems{Vec.size()};
16+
sycl::buffer<int, 1> Buf(Vec.data(), numOfItems);
17+
18+
queue Q;
19+
Q.submit([&](handler &CGH) {
20+
auto Acc = Buf.template get_access<mode::read_write>(CGH);
21+
22+
CGH.parallel_for<class TheKernel>(
23+
numOfItems, [=](item<1> Item) { kernelFunc(&Acc[0], Item[0]); });
24+
});
25+
Q.wait();
26+
}
27+
28+
int main(int Argc, const char *Argv[]) {
29+
30+
assertTest();
31+
32+
std::cout << "The test ended." << std::endl;
33+
return 0;
34+
}

0 commit comments

Comments
 (0)