/*
 * Copyright 2011 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SFNTLY_CPP_SRC_TEST_TEST_UTILS_H_
#define SFNTLY_CPP_SRC_TEST_TEST_UTILS_H_

// Must include this before ICU to avoid stdint redefinition issue.
#include "sfntly/port/type.h"

#include <unicode/ucnv.h>

#include <string>

#include "sfntly/font.h"
#include "sfntly/data/memory_byte_array.h"

namespace sfntly {
class TestUtils {
  TestUtils();

 public:
  // Compare sections of two byte arrays for equality
  // @param b1 byte array 1
  // @param offset1 offset for comparison in byte array 1
  // @param b2 byte array 2
  // @param offset2 offset for comparison in byte array 2
  // @param length the length of the byte arrays to compare
  // @return true if the array segments are equal; false otherwise
  // TODO(dfilimon): implement
  static bool Equals(ByteArray* b1,
                     int32_t offset1,
                     ByteArray* b2,
                     int32_t offset2);

  // @param offset1 offset to start comparing the first ByteArray from
  // @param ba1 the first ByteArray
  // @param offset2 offset to start comparing the second ByteArray from
  // @param ba2 the second ByteArray
  // @param length the number of bytes to compare
  // @return true if all bytes in the ranges given are equal; false otherwise
  // TODO(dfilimon): implement
  static bool Equals(ByteArray* b1,
                     int32_t offset1,
                     ByteArray* b2,
                     int32_t offset2,
                     int32_t length);

  // TODO(dfilimon): implement FileOutputStream in port/file_output_stream.*
  // static OutputStream createOutputStream(const char* file_path);

  // TODO(dfilimon): adapt & implement
  // static FileChannel createFilechannelForWriting(File file);

  // Creates a new file including deleting an already existing file with the
  // same path and name and creating any needed directories.
  // TODO(dfilimon): implement
  static void CreateNewFile(const char* file_path);

  // Converts an integer into a 4 character string using the ASCII encoding.
  // @param i the value to convert
  // @return the String based on the number
  // TODO(dfilimon): implement
  static void DumpLongAsString(int32_t i, std::string* result);

  // Calculate an OpenType checksum from the array.
  // @param b the array to calculate checksum on
  // @param offset the starting index in the array
  // @param length the number of bytes to check; must be a multiple of 4
  // @return checksum
  // TODO(dfilimon): implement
  static int64_t CheckSum(ByteArray* b, int32_t offset, int32_t length);

  // Encode a single character in UTF-16.
  // We only support the BMP for now
  // @param encoder the encoder to use for the encoding
  // @param uchar the Unicode character to encode
  // @return the encoded character
  static int32_t EncodeOneChar(UConverter* encoder, int16_t uchar);

  // Get an encoder for the charset name.
  // If the name is null or the empty string then just return null.
  // @param charsetName the charset to get an encoder for
  // @return an encoder or null if no encoder available for charset name
  static UConverter* GetEncoder(const char* charsetName);

 private:
  static const char EXTENSION_SEPARATOR = '.';

 public:
  // Get the extension of a file's name.
  // @param file the whose name to process
  // @return string containing the extension or an empty string if
  // there is no extension
  static const char* Extension(const char* file_path);
};
}
#endif  // SFNTLY_CPP_SRC_TEST_TEST_UTILS_H_