blob: 2457f0d35f7f8190a0be583f5f3ad3a24ea34eab [file]
#include "wasm-traversal.h"
#include "wasm.h"
#include "gtest/gtest.h"
using LeavesTest = ::testing::Test;
using namespace wasm;
TEST_F(LeavesTest, Manual) {
// Verify some interesting cases manually.
// LocalGet is a leaf.
EXPECT_TRUE(IsLeaf<LocalGet>::value);
// GlobalSet is not a leaf due to a child.
EXPECT_FALSE(IsLeaf<GlobalSet>::value);
// Return is not a leaf due to an optional child.
EXPECT_FALSE(IsLeaf<Return>::value);
// Call is not a leaf due to a vector of children.
EXPECT_FALSE(IsLeaf<Call>::value);
}
TEST_F(LeavesTest, Automatic) {
// Verify them all automatically.
// Count total expression classes and total with children.
size_t total = 0, totalWithChildren = 0;
#define DELEGATE_FIELD_CASE_START(id) \
{ \
bool hasChildren = false;
#define DELEGATE_FIELD_CHILD(id, field) hasChildren = true;
#define DELEGATE_FIELD_OPTIONAL_CHILD(id, field) hasChildren = true;
#define DELEGATE_FIELD_CHILD_VECTOR(id, field) hasChildren = true;
// Verify that IsLeaf has the right value.
#define DELEGATE_FIELD_CASE_END(id) \
EXPECT_EQ(IsLeaf<id>::value, !hasChildren); \
total++; \
if (hasChildren) { \
totalWithChildren++; \
} \
}
#define DELEGATE_FIELD_INT(id, field)
#define DELEGATE_FIELD_LITERAL(id, field)
#define DELEGATE_FIELD_NAME(id, field)
#define DELEGATE_FIELD_SCOPE_NAME_DEF(id, field)
#define DELEGATE_FIELD_SCOPE_NAME_USE(id, field)
#define DELEGATE_FIELD_TYPE(id, field)
#define DELEGATE_FIELD_HEAPTYPE(id, field)
#define DELEGATE_FIELD_ADDRESS(id, field)
#define DELEGATE_FIELD_INT_ARRAY(id, field)
#define DELEGATE_FIELD_INT_VECTOR(id, field)
#define DELEGATE_FIELD_NAME_VECTOR(id, field)
#define DELEGATE_FIELD_NAME_USE_VECTOR(id, field)
#define DELEGATE_FIELD_TYPE_VECTOR(id, field)
#define DELEGATE_FIELD_SCOPE_NAME_USE_VECTOR(id, field)
#define DELEGATE_FIELD_MAIN_START
#define DELEGATE_FIELD_MAIN_END
#include "wasm-delegations-fields.def"
// Not all have children (this just verifies the macros are actually doing
// something).
EXPECT_LT(totalWithChildren, total);
EXPECT_GT(totalWithChildren, 0);
EXPECT_GT(total, 0);
}