16b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com/*
26b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * Copyright 2011 Google Inc. All Rights Reserved.
36b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com *
46b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * Licensed under the Apache License, Version 2.0 (the "License");
56b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * you may not use this file except in compliance with the License.
66b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * You may obtain a copy of the License at
76b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com *
86b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com *      http://www.apache.org/licenses/LICENSE-2.0
96b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com *
106b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * Unless required by applicable law or agreed to in writing, software
116b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * distributed under the License is distributed on an "AS IS" BASIS,
126b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * See the License for the specific language governing permissions and
146b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com * limitations under the License.
156b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com */
166b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
1774250f66a0f41c5f6ae15cfcebaa402f4f355d5aarthurhsu@google.com#include "test/test_utils.h"
1874250f66a0f41c5f6ae15cfcebaa402f4f355d5aarthurhsu@google.com
196b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include <stdio.h>
206b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include <unicode/ucnv.h>
216b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include <unicode/uchar.h>
226b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
236b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include "gtest/gtest.h"
246b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include "sfntly/font.h"
256b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include "sfntly/data/memory_byte_array.h"
266b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include "sfntly/data/growable_memory_byte_array.h"
276b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include "sfntly/port/file_input_stream.h"
286b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
296b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.comnamespace sfntly {
306b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.comTestUtils::TestUtils() {}
316b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
326b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// static
33246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com// OutputStream CreateOutputStream(const char *file_path) {
346b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// }
356b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
366b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// static
37246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com// void TestUtils::CreateNewFile(const char* file_path) {
386b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// }
396b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
406b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// static
41246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comint32_t TestUtils::EncodeOneChar(UConverter* encoder, int16_t uchar) {
426b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  char* target = new char[ucnv_getMaxCharSize(encoder) * 2];
436b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  char* target_end;
446b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  UChar* source = new UChar[2];
456b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  UChar* source_end;
466b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  source[0] = (UChar)uchar;
476b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  source[1] = 0;
486b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  UErrorCode status = U_ZERO_ERROR;
496b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  source_end = source;
506b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  target_end = target;
516b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  ucnv_fromUnicode(encoder, &target_end, target + 4,
526b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com                   (const UChar**)&source_end, source + sizeof(UChar),
536b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com                   NULL, TRUE, &status);
546b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  if (!U_SUCCESS(status)) {
556b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    fprintf(stderr, "Error occured in conversion of %d: %s\n",
566b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com            uchar, u_errorName(status));
576b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    delete[] source;
586b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    delete[] target;
596b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    return 0;
606b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  }
616b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  int32_t enc_char = 0;
626b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  for (int32_t position = 0; position < target_end - target; ++position) {
636b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    enc_char <<= 8;
646b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    enc_char |= (target[position] & 0xff);
656b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  }
666b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  delete[] source;
676b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  delete[] target;
686b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  return enc_char;
696b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com}
706b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
716b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// static
72246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comUConverter* TestUtils::GetEncoder(const char* charset_name) {
736b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  if (charset_name == NULL || strcmp(charset_name, "") == 0)
746b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    return NULL;
756b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  UErrorCode status = U_ZERO_ERROR;
766b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  UConverter* conv = ucnv_open(charset_name, &status);
776b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  // if (!U_SUCCESS(status))
786b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  //   return NULL;
796b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  return conv;  // returns NULL @ error anyway
806b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com}
816b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
826b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// Get a file's extension
836b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// static
84246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.comconst char* TestUtils::Extension(const char* file_path) {
856b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  if (!file_path)
866b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    return NULL;
876b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  return strrchr(file_path, EXTENSION_SEPARATOR);
886b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com}
896b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com}
90