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
176a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com// Must include at the first line to avoid ICU / stdint conflict.
186a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com#include "sfntly/port/type.h"
1974250f66a0f41c5f6ae15cfcebaa402f4f355d5aarthurhsu@google.com
206b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include <stdio.h>
216b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include <unicode/ucnv.h>
226b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include <unicode/uchar.h>
236b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
246b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include "gtest/gtest.h"
256b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com#include "test/test_utils.h"
266b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
276b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.comnamespace sfntly {
286b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
296b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// Check if proper encoding is being performed
306b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// Conversion is done from UTF16 to UTF8, SJIS
31246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.combool TestEncoding() {
32246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com  UConverter* conv = TestUtils::GetEncoder("utf8");
336b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  EXPECT_TRUE(conv != NULL);
346b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  // Ūnĭcōde̽
356b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  UChar from[8] = {0x016A, 0x006E, 0x012D, 0x0063, 0x014D, 0x0064, 0x0065,
366b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com                   0x033D};
376b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  int32_t want[12] = {0xc5, 0xaa, 0x6e, 0xc4, 0xad, 0x63, 0xc5, 0x8d, 0x64,
386b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com                      0x65, 0xcc, 0xbd};
396b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  int32_t i, j = 0;
406b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  for (i = 0; i < 7; ++i) {
41246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com    int32_t encoded = TestUtils::EncodeOneChar(conv, (int16_t)from[i]);
426b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    for (; encoded; encoded <<= 8) {
436b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com      byte_t b = (encoded & 0xff000000) >> 24;
446b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com      if (!b)
456b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com        continue;
466b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com      EXPECT_EQ(want[j], b);
476b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com      if (want[j++] != b) {
486b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com        ucnv_close(conv);
496b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com        return false;
506b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com      }
516b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com    }
526b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  }
536b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  ucnv_close(conv);
546b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  return true;
556b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com}
566b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
576b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com// Check if the proper extension is obtained
58246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.combool TestExtension() {
596b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  // usual file name
606b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  const char *result;
61246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com  result = TestUtils::Extension("../data/ext/tuffy.ttf");
626b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  EXPECT_EQ(strcmp(result, ".ttf"), 0);
636b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
646b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  // more than one 'extension'
65246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com  result = TestUtils::Extension("tuffy.ttf.fake");
666b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  EXPECT_EQ(strcmp(result, ".fake"), 0);
676b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
686b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  // no extension
69246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com  result = TestUtils::Extension("tuffy");
706b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  EXPECT_STREQ(result, NULL);
716b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
726b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  // bogus extension
73246300f7fab1f2539c3207ce5ec28cc355465be8arthurhsu@google.com  result = TestUtils::Extension("tuffy.");
746b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  EXPECT_EQ(strcmp(result, "."), 0);
756b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
766b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com  return true;
776b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com}
786b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com
796b5ae74df6b2ff199c63923219c9a18bd9c4d931arthurhsu@google.com}  // namespace sfntly
806a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com
816a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.comTEST(TestUtils, All) {
826a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com  ASSERT_TRUE(sfntly::TestExtension());
836a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com  ASSERT_TRUE(sfntly::TestEncoding());
846a22b959c06e66a039c630e6ac514234114b46cbarthurhsu@google.com}
85