// Protocol Buffers - Google's data interchange format
// Copyright 2017 Google Inc.  All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#import <Foundation/Foundation.h>
#import <XCTest/XCTest.h>

#import "GPBDictionary.h"
#import "GPBDictionary_PackagePrivate.h"

#import "GPBTestUtilities.h"

#pragma mark - GPBAutocreatedDictionary Tests

// These are hand written tests to double check some behaviors of the
// GPBAutocreatedDictionary.  The GPBDictionary+[type]Tests files are generate
// tests.

// NOTE: GPBAutocreatedDictionary is private to the library, users of the
// library should never have to directly deal with this class.

@interface GPBAutocreatedDictionaryTests : XCTestCase
@end

@implementation GPBAutocreatedDictionaryTests

- (void)testEquality {
  GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];

  XCTAssertTrue([dict isEqual:@{}]);
  XCTAssertTrue([dict isEqualToDictionary:@{}]);

  XCTAssertFalse([dict isEqual:@{ @"foo" : @"bar" }]);
  XCTAssertFalse([dict isEqualToDictionary:@{ @"foo" : @"bar" }]);

  [dict setObject:@"bar" forKey:@"foo"];

  XCTAssertFalse([dict isEqual:@{}]);
  XCTAssertFalse([dict isEqualToDictionary:@{}]);
  XCTAssertTrue([dict isEqual:@{ @"foo" : @"bar" }]);
  XCTAssertTrue([dict isEqualToDictionary:@{ @"foo" : @"bar" }]);
  XCTAssertFalse([dict isEqual:@{ @"bar" : @"baz" }]);
  XCTAssertFalse([dict isEqualToDictionary:@{ @"bar" : @"baz" }]);

  GPBAutocreatedDictionary *dict2 = [[GPBAutocreatedDictionary alloc] init];

  XCTAssertFalse([dict isEqual:dict2]);
  XCTAssertFalse([dict isEqualToDictionary:dict2]);

  [dict2 setObject:@"mumble" forKey:@"foo"];
  XCTAssertFalse([dict isEqual:dict2]);
  XCTAssertFalse([dict isEqualToDictionary:dict2]);

  [dict2 setObject:@"bar" forKey:@"foo"];
  XCTAssertTrue([dict isEqual:dict2]);
  XCTAssertTrue([dict isEqualToDictionary:dict2]);

  [dict2 release];
  [dict release];
}

- (void)testCopy {
  {
    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];

    NSDictionary *cpy = [dict copy];
    XCTAssertTrue(cpy != dict); // Ptr compare
    XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]);
    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy.count, (NSUInteger)0);

    NSDictionary *cpy2 = [dict copy];
    XCTAssertTrue(cpy2 != dict); // Ptr compare
    XCTAssertTrue(cpy2 != cpy); // Ptr compare
    XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]);
    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy2.count, (NSUInteger)0);

    [cpy2 release];
    [cpy release];
    [dict release];
  }

  {
    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];

    NSMutableDictionary *cpy = [dict mutableCopy];
    XCTAssertTrue(cpy != dict); // Ptr compare
    XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]);
    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy.count, (NSUInteger)0);

    NSMutableDictionary *cpy2 = [dict mutableCopy];
    XCTAssertTrue(cpy2 != dict); // Ptr compare
    XCTAssertTrue(cpy2 != cpy); // Ptr compare
    XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]);
    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy2.count, (NSUInteger)0);

    [cpy2 release];
    [cpy release];
    [dict release];
  }

  {
    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
    dict[@"foo"] = @"bar";
    dict[@"baz"] = @"mumble";

    NSDictionary *cpy = [dict copy];
    XCTAssertTrue(cpy != dict); // Ptr compare
    XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]);
    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy.count, (NSUInteger)2);
    XCTAssertEqualObjects(cpy[@"foo"], @"bar");
    XCTAssertEqualObjects(cpy[@"baz"], @"mumble");

    NSDictionary *cpy2 = [dict copy];
    XCTAssertTrue(cpy2 != dict); // Ptr compare
    XCTAssertTrue(cpy2 != cpy); // Ptr compare
    XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]);
    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy2.count, (NSUInteger)2);
    XCTAssertEqualObjects(cpy2[@"foo"], @"bar");
    XCTAssertEqualObjects(cpy2[@"baz"], @"mumble");

    [cpy2 release];
    [cpy release];
    [dict release];
  }

  {
    GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
    dict[@"foo"] = @"bar";
    dict[@"baz"] = @"mumble";

    NSMutableDictionary *cpy = [dict mutableCopy];
    XCTAssertTrue(cpy != dict); // Ptr compare
    XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]);
    XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy.count, (NSUInteger)2);
    XCTAssertEqualObjects(cpy[@"foo"], @"bar");
    XCTAssertEqualObjects(cpy[@"baz"], @"mumble");

    NSMutableDictionary *cpy2 = [dict mutableCopy];
    XCTAssertTrue(cpy2 != dict); // Ptr compare
    XCTAssertTrue(cpy2 != cpy); // Ptr compare
    XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]);
    XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
    XCTAssertEqual(cpy2.count, (NSUInteger)2);
    XCTAssertEqualObjects(cpy2[@"foo"], @"bar");
    XCTAssertEqualObjects(cpy2[@"baz"], @"mumble");

    [cpy2 release];
    [cpy release];
    [dict release];
  }
}

@end
