130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_TEST_TEST_UTILS_H_
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_TEST_TEST_UTILS_H_
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Must include this before ICU to avoid stdint redefinition issue.
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <unicode/ucnv.h>
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string>
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h"
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/memory_byte_array.h"
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TestUtils {
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  TestUtils();
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Compare sections of two byte arrays for equality
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b1 byte array 1
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset1 offset for comparison in byte array 1
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b2 byte array 2
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset2 offset for comparison in byte array 2
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the length of the byte arrays to compare
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return true if the array segments are equal; false otherwise
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(dfilimon): implement
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static bool Equals(ByteArray* b1,
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     int32_t offset1,
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     ByteArray* b2,
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     int32_t offset2);
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset1 offset to start comparing the first ByteArray from
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param ba1 the first ByteArray
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset2 offset to start comparing the second ByteArray from
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param ba2 the second ByteArray
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the number of bytes to compare
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return true if all bytes in the ranges given are equal; false otherwise
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(dfilimon): implement
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static bool Equals(ByteArray* b1,
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     int32_t offset1,
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     ByteArray* b2,
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     int32_t offset2,
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     int32_t length);
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(dfilimon): implement FileOutputStream in port/file_output_stream.*
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // static OutputStream createOutputStream(const char* file_path);
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(dfilimon): adapt & implement
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // static FileChannel createFilechannelForWriting(File file);
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Creates a new file including deleting an already existing file with the
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // same path and name and creating any needed directories.
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(dfilimon): implement
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static void CreateNewFile(const char* file_path);
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Converts an integer into a 4 character string using the ASCII encoding.
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param i the value to convert
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the String based on the number
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(dfilimon): implement
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static void DumpLongAsString(int32_t i, std::string* result);
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Calculate an OpenType checksum from the array.
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b the array to calculate checksum on
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset the starting index in the array
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the number of bytes to check; must be a multiple of 4
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return checksum
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TODO(dfilimon): implement
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static int64_t CheckSum(ByteArray* b, int32_t offset, int32_t length);
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Encode a single character in UTF-16.
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // We only support the BMP for now
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param encoder the encoder to use for the encoding
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param uchar the Unicode character to encode
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the encoded character
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static int32_t EncodeOneChar(UConverter* encoder, int16_t uchar);
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Get an encoder for the charset name.
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // If the name is null or the empty string then just return null.
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param charsetName the charset to get an encoder for
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return an encoder or null if no encoder available for charset name
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static UConverter* GetEncoder(const char* charsetName);
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private:
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const char EXTENSION_SEPARATOR = '.';
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Get the extension of a file's name.
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param file the whose name to process
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return string containing the extension or an empty string if
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // there is no extension
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const char* Extension(const char* file_path);
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_TEST_TEST_UTILS_H_
111