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 "gtest/gtest.h"
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/tag.h"
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/growable_memory_byte_array.h"
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/writable_font_data.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/math/fixed1616.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/memory_output_stream.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/font_output_stream.h"
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TestEndian() {
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  byte_t test_data[] = {
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      0x68, 0x65, 0x61, 0x64,  // 0: head
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      0xca, 0xca, 0xca, 0xca,  // 4: ubyte, byte, char
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      0x00, 0x18, 0x80, 0x18,  // 8: ushort, short
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      0x00, 0x00, 0x18, 0x00,  // 12: uint24
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      0x00, 0x00, 0x00, 0x18,  // 16: ulong
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      0xff, 0xff, 0xff, 0x00,  // 20: long
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      0x00, 0x01, 0x00, 0x00   // 24: fixed
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  };
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteArrayPtr ba1 = new GrowableMemoryByteArray();
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (size_t i = 0; i < sizeof(test_data); ++i) {
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    ba1->Put(i, test_data[i]);
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ReadableFontDataPtr rfd = new ReadableFontData(ba1);
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadULongAsInt(0), Tag::head);
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadUByte(4), 202);
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadByte(5), -54);
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadChar(6), 202);
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadUShort(8), 24);
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadShort(10), -32744);
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadUInt24(12), 24);
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadULong(16), 24);
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadLong(20), -256);
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(rfd->ReadFixed(24), Fixed1616::Fixed(1, 0));
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  MemoryOutputStream os;
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontOutputStream fos(&os);
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteULong(Tag::head);
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.Write(202);
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.Write(202);
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.Write(202);
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.Write(202);
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteUShort(24);
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteShort(-32744);
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteUInt24(24);
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteChar(0);
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteULong(24);
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteLong(-256);
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fos.WriteFixed(Fixed1616::Fixed(1, 0));
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(memcmp(os.Get(), test_data, sizeof(test_data)), 0);
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTEST(Endian, All) {
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ASSERT_TRUE(sfntly::TestEndian());
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
78