// Copyright 2013 The Flutter 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 "flutter/fml/base32.h"
#include "gtest/gtest.h"

#include <iostream>

TEST(Base32Test, CanEncode) {
  {
    auto result = fml::Base32Encode("hello");
    ASSERT_TRUE(result.first);
    ASSERT_EQ(result.second, "NBSWY3DP");
  }

  {
    auto result = fml::Base32Encode("helLo");
    ASSERT_TRUE(result.first);
    ASSERT_EQ(result.second, "NBSWYTDP");
  }

  {
    auto result = fml::Base32Encode("");
    ASSERT_TRUE(result.first);
    ASSERT_EQ(result.second, "");
  }

  {
    auto result = fml::Base32Encode("1");
    ASSERT_TRUE(result.first);
    ASSERT_EQ(result.second, "GE");
  }

  {
    auto result = fml::Base32Encode("helLo");
    ASSERT_TRUE(result.first);
    ASSERT_EQ(result.second, "NBSWYTDP");
  }
}

TEST(Base32Test, CanEncodeDecodeStrings) {
  std::vector<std::string> strings = {"hello", "helLo", "", "1", "\0"};
  for (size_t i = 0; i < strings.size(); i += 1) {
    auto encode_result = fml::Base32Encode(strings[i]);
    ASSERT_TRUE(encode_result.first);
    auto decode_result = fml::Base32Decode(encode_result.second);
    ASSERT_TRUE(decode_result.first);
    const std::string& decoded = decode_result.second;
    std::string decoded_string(decoded.data(), decoded.size());
    ASSERT_EQ(strings[i], decoded_string);
  }
}

TEST(Base32Test, DecodeReturnsFalseForInvalideInput) {
  // "B" is invalid because it has a non-zero padding.
  std::vector<std::string> invalid_inputs = {"a", "1", "9", "B"};
  for (const std::string& input : invalid_inputs) {
    auto decode_result = fml::Base32Decode(input);
    if (decode_result.first) {
      std::cout << "Base32Decode should return false on " << input << std::endl;
    }
    ASSERT_FALSE(decode_result.first);
  }
}

TEST(Base32Test, CanDecodeSkSLKeys) {
  std::vector<std::string> inputs = {
      "CAZAAAACAAAAADQAAAABKAAAAAJQAAIA7777777777776EYAAEAP777777777777AAAAAABA"
      "ABTAAAAAAAAAAAAAAABAAAAAGQAGGAA",
      "CAZAAAICAAAAAAAAAAADOAAAAAJQAAIA777777Y4AAKAAEYAAEAP777777777777EAAGMAAA"
      "AAAAAAAAAAACQACNAAAAAAAAAAAAAAACAAAAAPAAMMAA",
      "CAZACAACAAAABAYACAAAAAAAAAJQAAIADQABIAH777777777777RQAAOAAAAAAAAAAAAAABE"
      "AANQAAAAAAAAAAAAAAYAAJYAAAAAAAANAAAQAAAAAAAEAAAHAAAAAAAAAAAAAAANAAAQAAAA"
      "AAAFIADKAAAAAAAAAAAAAAACAAAAAZAAMMAA"};
  for (const std::string& input : inputs) {
    auto decode_result = fml::Base32Decode(input);
    if (!decode_result.first) {
      std::cout << "Base32Decode should return true on " << input << std::endl;
    }
    ASSERT_TRUE(decode_result.first);
    auto encode_result = fml::Base32Encode(decode_result.second);
    ASSERT_TRUE(encode_result.first);
    ASSERT_EQ(encode_result.second, input);
  }
}
