// Copyright 2025 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gn/functions.h"
#include "gn/test_with_scope.h"
#include "util/test/test.h"

TEST(LenTest, StringLen) {
  TestWithScope setup;
  FunctionCallNode function_call;
  Err err;
  std::vector<Value> args;
  args.push_back(Value(nullptr, "foo"));
  Value result = functions::RunLen(setup.scope(), &function_call, args, &err);
  EXPECT_SUCCESS(err);
  EXPECT_EQ(result.type(), Value::INTEGER);
  EXPECT_EQ(result.int_value(), 3);
}

TEST(LenTest, ListLen) {
  TestWithScope setup;
  FunctionCallNode function_call;
  Err err;
  std::vector<Value> args;
  Value list_value(nullptr, Value::LIST);
  list_value.list_value().push_back(Value(nullptr, "a"));
  list_value.list_value().push_back(Value(nullptr, "b"));
  args.push_back(list_value);
  Value result = functions::RunLen(setup.scope(), &function_call, args, &err);
  EXPECT_SUCCESS(err);
  EXPECT_EQ(result.type(), Value::INTEGER);
  EXPECT_EQ(result.int_value(), 2);
}

TEST(LenTest, InvalidType) {
  TestWithScope setup;
  FunctionCallNode function_call;
  Err err;
  std::vector<Value> args;
  args.push_back(Value(nullptr, static_cast<int64_t>(123)));
  functions::RunLen(setup.scope(), &function_call, args, &err);
  EXPECT_TRUE(err.has_error());
}

TEST(LenTest, WrongArugmentCount) {
  TestWithScope setup;
  FunctionCallNode function_call;
  Err err;
  std::vector<Value> args;
  // No Args:
  functions::RunLen(setup.scope(), &function_call, args, &err);
  EXPECT_TRUE(err.has_error());

  // Two Args:
  args.push_back(Value(nullptr, "a"));
  args.push_back(Value(nullptr, "b"));
  functions::RunLen(setup.scope(), &function_call, args, &err);
  EXPECT_TRUE(err.has_error());
}
