// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import <Foundation/Foundation.h>

#include "base/basictypes.h"
#include "base/memory/scoped_nsobject.h"
#include "chrome/common/mac/nscoder_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"

namespace {

typedef PlatformTest NSCoderStdStringTest;

const char* testStrings[] = {
  "Arf",
  "",
  "This is working™",
  "古池や蛙飛込む水の音\nふるいけやかわずとびこむみずのおと",
  "ἀγεωμέτρητος μηδεὶς εἰσίτω",
  "Bang!\t\n"
};

TEST_F(NSCoderStdStringTest, encodeDecode) {
  for (size_t i = 0; i < arraysize(testStrings); ++i) {
    NSMutableData *data = [NSMutableData data];

    scoped_nsobject<NSKeyedArchiver> archiver(
        [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]);
    nscoder_util::EncodeString(archiver, @"test", testStrings[i]);
    [archiver finishEncoding];

    scoped_nsobject<NSKeyedUnarchiver> unarchiver(
        [[NSKeyedUnarchiver alloc] initForReadingWithData:data]);
    const std::string decoded = nscoder_util::DecodeString(unarchiver, @"test");

    EXPECT_EQ(decoded, testStrings[i]);
  }
}

TEST_F(NSCoderStdStringTest, decodeEmpty) {
  NSMutableData *data = [NSMutableData data];

  scoped_nsobject<NSKeyedArchiver> archiver(
      [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]);
  [archiver finishEncoding];

  scoped_nsobject<NSKeyedUnarchiver> unarchiver(
      [[NSKeyedUnarchiver alloc] initForReadingWithData:data]);
  const std::string decoded = nscoder_util::DecodeString(unarchiver, @"test");

  EXPECT_EQ(decoded, "");
}

}  // namespace