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