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#include "test/test_utils.h" 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h> 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <unicode/ucnv.h> 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <unicode/uchar.h> 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gtest/gtest.h" 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h" 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/memory_byte_array.h" 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/growable_memory_byte_array.h" 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/file_input_stream.h" 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTestUtils::TestUtils() {} 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// OutputStream CreateOutputStream(const char *file_path) { 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// } 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// void TestUtils::CreateNewFile(const char* file_path) { 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// } 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t TestUtils::EncodeOneChar(UConverter* encoder, int16_t uchar) { 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun char* target = new char[ucnv_getMaxCharSize(encoder) * 2]; 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun char* target_end; 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UChar* source = new UChar[2]; 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UChar* source_end; 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun source[0] = (UChar)uchar; 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun source[1] = 0; 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UErrorCode status = U_ZERO_ERROR; 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun source_end = source; 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun target_end = target; 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ucnv_fromUnicode(encoder, &target_end, target + 4, 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (const UChar**)&source_end, source + sizeof(UChar), 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun NULL, TRUE, &status); 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!U_SUCCESS(status)) { 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stderr, "Error occured in conversion of %d: %s\n", 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun uchar, u_errorName(status)); 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun delete[] source; 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun delete[] target; 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return 0; 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t enc_char = 0; 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for (int32_t position = 0; position < target_end - target; ++position) { 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enc_char <<= 8; 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enc_char |= (target[position] & 0xff); 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun delete[] source; 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun delete[] target; 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return enc_char; 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunUConverter* TestUtils::GetEncoder(const char* charset_name) { 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (charset_name == NULL || strcmp(charset_name, "") == 0) 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UErrorCode status = U_ZERO_ERROR; 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun UConverter* conv = ucnv_open(charset_name, &status); 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // if (!U_SUCCESS(status)) 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // return NULL; 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return conv; // returns NULL @ error anyway 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Get a file's extension 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst char* TestUtils::Extension(const char* file_path) { 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!file_path) 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return NULL; 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return strrchr(file_path, EXTENSION_SEPARATOR); 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 90