/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "gtest/gtest.h"
#include "nsString.h"
#include "VideoUtils.h"

using namespace mozilla;

TEST(StringListRange, MakeStringListRange)
{
  static const struct
  {
    const char* mList;
    const char* mExpected;
  } tests[] =
  {
    { "", "" },
    { " ", "" },
    { ",", "" },
    { " , ", "" },
    { "a", "a|" },
    { "  a  ", "a|" },
    { "aa,bb", "aa|bb|" },
    { " a a ,  b b  ", "a a|b b|" },
    { " , ,a 1,,  ,b  2,", "a 1|b  2|" }
  };

  for (const auto& test : tests) {
    nsCString list(test.mList);
    nsCString out;
    for (const auto& item : MakeStringListRange(list)) {
      out += item;
      out += "|";
    }
    EXPECT_STREQ(test.mExpected, out.Data());
  }
}

TEST(StringListRange, StringListContains)
{
  static const struct
  {
    const char* mList;
    const char* mItemToSearch;
    bool mExpected;
  } tests[] =
  {
    { "", "", false },
    { "", "a", false },
    { " ", "a", false },
    { ",", "a", false },
    { " , ", "", false },
    { " , ", "a", false },
    { "a", "a", true },
    { "a", "b", false },
    { "  a  ", "a", true },
    { "aa,bb", "aa", true },
    { "aa,bb", "bb", true },
    { "aa,bb", "cc", false },
    { "aa,bb", " aa ", false },
    { " a a ,  b b  ", "a a", true },
    { " , ,a 1,,  ,b  2,", "a 1", true },
    { " , ,a 1,,  ,b  2,", "b  2", true },
    { " , ,a 1,,  ,b  2,", "", false },
    { " , ,a 1,,  ,b  2,", " ", false },
    { " , ,a 1,,  ,b  2,", "A 1", false },
    { " , ,A 1,,  ,b  2,", "a 1", false }
  };

  for (const auto& test : tests) {
    nsCString list(test.mList);
    nsCString itemToSearch(test.mItemToSearch);
    EXPECT_EQ(test.mExpected, StringListContains(list, itemToSearch))
      << "trying to find \"" << itemToSearch.Data()
      << "\" in \"" << list.Data() << "\"";
  }
}