Syntax Tests: extract array_length_* tests.

This commit is contained in:
Daniel Kirchner 2018-04-11 18:01:01 +02:00
parent d50d1f0ac1
commit fdcbf1337a
20 changed files with 117 additions and 165 deletions

View File

@ -7720,171 +7720,6 @@ BOOST_AUTO_TEST_CASE(address_overload_resolution)
CHECK_SUCCESS(text);
}
BOOST_AUTO_TEST_CASE(array_length_too_large)
{
char const* text = R"(
contract C {
uint[8**90] ids;
}
)";
CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal or constant expression.");
}
BOOST_AUTO_TEST_CASE(array_length_not_convertible_to_integer)
{
char const* text = R"(
contract C {
uint[true] ids;
}
)";
CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal or constant expression.");
}
BOOST_AUTO_TEST_CASE(array_length_constant_var)
{
char const* text = R"(
contract C {
uint constant LEN = 10;
uint[LEN] ids;
}
)";
CHECK_SUCCESS(text);
}
BOOST_AUTO_TEST_CASE(array_length_non_integer_constant_var)
{
char const* text = R"(
contract C {
bool constant LEN = true;
uint[LEN] ids;
}
)";
CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal or constant expression.");
}
BOOST_AUTO_TEST_CASE(array_length_cannot_be_function)
{
char const* text = R"(
contract C {
function f() {}
uint[f] ids;
}
)";
CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal or constant expression.");
}
BOOST_AUTO_TEST_CASE(array_length_can_be_recursive_constant)
{
char const* text = R"(
contract C {
uint constant L = 5;
uint constant LEN = L + 4 * L;
uint[LEN] ids;
}
)";
CHECK_SUCCESS(text);
}
BOOST_AUTO_TEST_CASE(array_length_cannot_be_function_call)
{
char const* text = R"(
contract C {
function f(uint x) {}
uint constant LEN = f();
uint[LEN] ids;
}
)";
CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal or constant expression.");
}
BOOST_AUTO_TEST_CASE(array_length_const_cannot_be_fractional)
{
char const* text = R"(
contract C {
fixed constant L = 10.5;
uint[L] ids;
}
)";
CHECK_ERROR(text, TypeError, "Array with fractional length specified");
}
BOOST_AUTO_TEST_CASE(array_length_can_be_constant_in_struct)
{
char const* text = R"(
contract C {
uint constant LEN = 10;
struct Test {
uint[LEN] ids;
}
}
)";
CHECK_SUCCESS(text);
}
BOOST_AUTO_TEST_CASE(array_length_can_be_constant_in_function)
{
char const* text = R"(
contract C {
uint constant LEN = 10;
function f() {
uint[LEN] a;
}
}
)";
CHECK_SUCCESS(text);
}
BOOST_AUTO_TEST_CASE(array_length_cannot_be_constant_function_parameter)
{
char const* text = R"(
contract C {
function f(uint constant LEN) {
uint[LEN] a;
}
}
)";
CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal or constant expression.");
}
BOOST_AUTO_TEST_CASE(array_length_with_cyclic_constant)
{
char const* text = R"(
contract C {
uint constant LEN = LEN;
function f() {
uint[LEN] a;
}
}
)";
CHECK_ERROR(text, TypeError, "Cyclic constant definition (or maximum recursion depth exhausted).");
}
BOOST_AUTO_TEST_CASE(array_length_with_complex_cyclic_constant)
{
char const* text = R"(
contract C {
uint constant L2 = LEN - 10;
uint constant L1 = L2 / 10;
uint constant LEN = 10 + L1 * 5;
function f() {
uint[LEN] a;
}
}
)";
CHECK_ERROR(text, TypeError, "Cyclic constant definition (or maximum recursion depth exhausted).");
}
BOOST_AUTO_TEST_CASE(array_length_with_pure_functions)
{
char const* text = R"(
contract C {
uint constant LEN = keccak256(ripemd160(33));
uint[LEN] ids;
}
)";
CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal or constant expression.");
}
BOOST_AUTO_TEST_CASE(array_length_invalid_expression)
{
char const* text = R"(

View File

@ -0,0 +1,7 @@
contract C {
function f(uint constant LEN) {
uint[LEN] a;
}
}
// ----
// TypeError: (62-65): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,8 @@
contract C {
uint constant LEN = 10;
function f() public pure {
uint[LEN] memory a;
a;
}
}
// ----

View File

@ -0,0 +1,7 @@
contract C {
uint constant LEN = 10;
struct Test {
uint[LEN] ids;
}
}
// ----

View File

@ -0,0 +1,6 @@
contract C {
uint constant L = 5;
uint constant LEN = L + 4 * L;
uint[LEN] ids;
}
// ----

View File

@ -0,0 +1,6 @@
contract C {
function f() {}
uint[f] ids;
}
// ----
// TypeError: (42-43): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,7 @@
contract C {
function f(uint x) {}
uint constant LEN = f();
uint[LEN] ids;
}
// ----
// TypeError: (77-80): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,10 @@
contract C {
uint constant L2 = LEN - 10;
uint constant L1 = L2 / 10;
uint constant LEN = 10 + L1 * 5;
function f() {
uint[LEN] a;
}
}
// ----
// TypeError: (36-39): Cyclic constant definition (or maximum recursion depth exhausted).

View File

@ -0,0 +1,6 @@
contract C {
fixed constant L = 10.5;
uint[L] ids;
}
// ----
// TypeError: (51-52): Array with fractional length specified.

View File

@ -0,0 +1,5 @@
contract C {
uint constant LEN = 10;
uint[LEN] ids;
}
// ----

View File

@ -0,0 +1,8 @@
contract C {
uint constant LEN = LEN;
function f() {
uint[LEN] a;
}
}
// ----
// TypeError: (37-40): Cyclic constant definition (or maximum recursion depth exhausted).

View File

@ -0,0 +1,5 @@
contract C {
uint[-true] ids;
}
// ----
// TypeError: (22-27): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,5 @@
contract C {
uint[true/1] ids;
}
// ----
// TypeError: (22-28): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,5 @@
contract C {
uint[1/true] ids;
}
// ----
// TypeError: (22-28): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,5 @@
contract C {
uint[1.111111E1111111111111] ids;
}
// ----
// TypeError: (22-44): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,5 @@
contract C {
uint[3/0] ids;
}
// ----
// TypeError: (22-25): Operator / not compatible with types int_const 3 and int_const 0

View File

@ -0,0 +1,6 @@
contract C {
bool constant LEN = true;
uint[LEN] ids;
}
// ----
// TypeError: (52-55): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,5 @@
contract C {
uint[true] ids;
}
// ----
// TypeError: (22-26): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,6 @@
contract C {
uint constant LEN = keccak256(ripemd160(33));
uint[LEN] ids;
}
// ----
// TypeError: (72-75): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,5 @@
contract C {
uint[8**90] ids;
}
// ----
// TypeError: (22-27): Invalid array length, expected integer literal or constant expression.