// Copyright 2019 The Fuchsia 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 "garnet/lib/debugger_utils/argv.h"

#include <gtest/gtest.h>

#include "src/lib/fxl/arraysize.h"

namespace debugger_utils {
namespace {

TEST(Argv, BuildFromStringView) {
  const fxl::StringView no_args{""};
  const Argv expected_none{};
  EXPECT_EQ(BuildArgv(no_args), expected_none);

  const fxl::StringView one_arg{"--foo"};
  const Argv expected_one{"--foo"};
  EXPECT_EQ(BuildArgv(one_arg), expected_one);

  const fxl::StringView multiple_args{"a b c"};
  const Argv expected_multiple{"a", "b", "c"};
  EXPECT_EQ(BuildArgv(multiple_args), expected_multiple);
}

TEST(Argv, BuildFromCStrings) {
  const char* const no_args[] = {};
  const Argv expected_none{};
  EXPECT_EQ(BuildArgv(no_args, 0), expected_none);

  const char* const one_arg[] = {"--foo"};
  const Argv expected_one{"--foo"};
  EXPECT_EQ(BuildArgv(one_arg, arraysize(one_arg)), expected_one);

  const char* const multiple_args[] = {"a", "b", "c"};
  const Argv expected_multiple{"a", "b", "c"};
  EXPECT_EQ(BuildArgv(multiple_args, arraysize(multiple_args)), expected_multiple);
}

TEST(Argv, ArgvToString) {
  const std::string no_args{""};
  EXPECT_EQ(ArgvToString(BuildArgv(no_args)), no_args);

  const std::string one_arg{"--foo"};
  EXPECT_EQ(ArgvToString(BuildArgv(one_arg)), one_arg);

  const std::string multiple_args{"a b c"};
  EXPECT_EQ(ArgvToString(BuildArgv(multiple_args)), multiple_args);
}

}  // namespace
}  // namespace debugger_utils
