// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_command_line.h"
#include "tests/gtest/include/gtest/gtest.h"

namespace {

void VerifyCommandLine(CefRefPtr<CefCommandLine> command_line,
                       const char* expected_arg1 = "arg1",
                       const char* expected_arg2 = "arg 2") {
  std::string program = command_line->GetProgram();
  EXPECT_EQ("test.exe", program);

  EXPECT_TRUE(command_line->HasSwitches());

  EXPECT_TRUE(command_line->HasSwitch("switch1"));
  std::string switch1 = command_line->GetSwitchValue("switch1");
  EXPECT_EQ("", switch1);
  EXPECT_TRUE(command_line->HasSwitch("switch2"));
  std::string switch2 = command_line->GetSwitchValue("switch2");
  EXPECT_EQ("val2", switch2);
  EXPECT_TRUE(command_line->HasSwitch("switch3"));
  std::string switch3 = command_line->GetSwitchValue("switch3");
  EXPECT_EQ("val3", switch3);
  EXPECT_TRUE(command_line->HasSwitch("switch4"));
  std::string switch4 = command_line->GetSwitchValue("switch4");
  EXPECT_EQ("val 4", switch4);
  EXPECT_FALSE(command_line->HasSwitch("switchnoexist"));

  CefCommandLine::SwitchMap switches;
  command_line->GetSwitches(switches);
  EXPECT_EQ((size_t)4, switches.size());

  bool has1 = false, has2 = false, has3 = false, has4 = false;

  CefCommandLine::SwitchMap::const_iterator it = switches.begin();
  for (; it != switches.end(); ++it) {
    std::string name = it->first;
    std::string val = it->second;

    if (name == "switch1") {
      has1 = true;
      EXPECT_EQ("", val);
    } else if (name == "switch2") {
      has2 = true;
      EXPECT_EQ("val2", val);
    } else if (name == "switch3") {
      has3 = true;
      EXPECT_EQ("val3", val);
    } else if (name == "switch4") {
      has4 = true;
      EXPECT_EQ("val 4", val);
    }
  }

  EXPECT_TRUE(has1);
  EXPECT_TRUE(has2);
  EXPECT_TRUE(has3);
  EXPECT_TRUE(has4);

  EXPECT_TRUE(command_line->HasArguments());

  CefCommandLine::ArgumentList args;
  command_line->GetArguments(args);
  EXPECT_EQ((size_t)2, args.size());
  std::string arg0 = args[0];
  EXPECT_EQ(expected_arg1, arg0);
  std::string arg1 = args[1];
  EXPECT_EQ(expected_arg2, arg1);

  command_line->Reset();
  EXPECT_FALSE(command_line->HasSwitches());
  EXPECT_FALSE(command_line->HasArguments());
  std::string cur_program = command_line->GetProgram();
  EXPECT_EQ(program, cur_program);
}

}  // namespace

// Test creating a command line from argc/argv or string.
TEST(CommandLineTest, Init) {
  CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();
  EXPECT_TRUE(command_line.get() != nullptr);

#if defined(OS_WIN)
  command_line->InitFromString(
      "test.exe --switch1 -switch2=val2 /switch3=val3 "
      "-switch4=\"val 4\" arg1 \"arg 2\"");
#else
  const char* args[] = {"test.exe",      "--switch1",      "-switch2=val2",
                        "-switch3=val3", "-switch4=val 4", "arg1",
                        "arg 2"};
  command_line->InitFromArgv(sizeof(args) / sizeof(char*), args);
#endif

  VerifyCommandLine(command_line);
}

// Test creating a command line using set and append methods.
TEST(CommandLineTest, Manual) {
  CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();
  EXPECT_TRUE(command_line.get() != nullptr);

  command_line->SetProgram("test.exe");
  command_line->AppendSwitch("switch1");
  command_line->AppendSwitchWithValue("switch2", "val2");
  command_line->AppendSwitchWithValue("switch3", "val3");
  command_line->AppendSwitchWithValue("switch4", "val 4");
  command_line->AppendArgument("arg1");
  command_line->AppendArgument("arg 2");

  VerifyCommandLine(command_line);
}

// Test that any prefixes included with the switches are ignored.
TEST(CommandLineTest, IgnorePrefixes) {
  CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();
  EXPECT_TRUE(command_line.get() != nullptr);

  command_line->SetProgram("test.exe");
  command_line->AppendSwitch("-switch1");
  command_line->AppendSwitchWithValue("--switch2", "val2");
  command_line->AppendSwitchWithValue("-switch3", "val3");
  command_line->AppendSwitchWithValue("-switch4", "val 4");

  // Prefixes will not be removed from arguments.
  const char arg1[] = "-arg1";
  const char arg2[] = "--arg 2";
  command_line->AppendArgument(arg1);
  command_line->AppendArgument(arg2);

  VerifyCommandLine(command_line, arg1, arg2);
}
