@ 261106.8
current
/*
 * Copyright 2026 WebAssembly Community Group participants
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "gmock/gmock.h"
#include "gtest/gtest.h"

#include "ir/module-utils.h"
#include "parser/wat-parser.h"
#include "wasm.h"

using namespace wasm;
using namespace testing;

namespace {

class ModuleUtilsTest : public Test {
protected:
  Module wasm;

  [[nodiscard]] bool parse(std::string_view text) {
    wasm.features = FeatureSet::All;
    auto parsed = WATParser::parseModule(wasm, text);
    if (auto* err = parsed.getErr()) {
      EXPECT_TRUE(false) << "Failed to parse WAT: " << err->msg;
      return false;
    }
    return true;
  }
};

TEST_F(ModuleUtilsTest, GetReferencedFuncs) {
  auto moduleText = R"wasm(
    (module
      (import "env" "imported" (func $imported))

      (table $table 1 funcref)
      (elem (table $table) (i32.const 0) func $table_func)

      (func $table_func)
      (func $ref_func)
      (func $unreferenced)

      (func $exported
        (drop (ref.func $ref_func))
      )
      (export "exported" (func $exported))
    )
  )wasm";

  ASSERT_TRUE(parse(moduleText));

  auto* tableFunc = wasm.getFunction("table_func");
  auto* refFunc = wasm.getFunction("ref_func");
  auto* exported = wasm.getFunction("exported");
  ASSERT_NE(tableFunc, nullptr);
  ASSERT_NE(refFunc, nullptr);
  ASSERT_NE(exported, nullptr);

  EXPECT_THAT(ModuleUtils::getReferencedFuncs(wasm),
              UnorderedElementsAre(tableFunc, refFunc, exported));
}

} // namespace