//
//  HBDictTests.m
//  HandBrake
//
//  Created by Damiano Galassi on 01/03/16.
//
//

#import <XCTest/XCTest.h>
#import "NSDictionary+HBAdditions.h"
#include "hb.h"

@interface HBDictTests : XCTestCase

@property (nonatomic, strong) NSDictionary *dict;

@end

@implementation HBDictTests

- (void)setUp
{
    [super setUp];
    self.dict = @{@"DoubleKey": @(20.3),
                  @"StringKey": @"miao",
                  @"BoolKey": @YES,
                  @"ArrayKey": @[@"First", @"Second", @20]};
}

- (void)tearDown
{
    self.dict = nil;
    [super tearDown];
}

- (void)testNSDictionaryToHBDict
{
    hb_dict_t *hbdict = self.dict.hb_value;

    double doubleValue = hb_value_get_double(hb_dict_get(hbdict, "DoubleKey"));
    XCTAssertEqual(doubleValue, [self.dict[@"DoubleKey"] doubleValue]);

    const char *stringValue = hb_value_get_string(hb_dict_get(hbdict, "StringKey"));
    XCTAssertEqualObjects(@(stringValue), self.dict[@"StringKey"]);

    BOOL boolValue = (BOOL)hb_value_get_bool(hb_dict_get(hbdict, "BoolKey"));
    XCTAssertEqual(boolValue, [self.dict[@"BoolKey"] boolValue]);

    hb_value_array_t *array = hb_dict_get(hbdict, "ArrayKey");

    size_t count = hb_value_array_len(array);
    XCTAssertEqual(count, [self.dict[@"ArrayKey"] count]);

    const char *arrayString = hb_value_get_string(hb_value_array_get(array, 0));
    XCTAssertEqualObjects(@(arrayString), self.dict[@"ArrayKey"][0]);

    long long arrayInt = hb_value_get_int(hb_value_array_get(array, 2));
    XCTAssertEqual(arrayInt, [self.dict[@"ArrayKey"][2] integerValue]);

    hb_dict_free(&hbdict);
}

- (void)testNSDictionaryToHBDictToNSDictionary
{
    hb_dict_t *hbdict = self.dict.hb_value;
    NSDictionary *result =  [[NSDictionary alloc] initWithHBDict:hbdict];

    XCTAssertEqualObjects(result[@"DoubleKey"], self.dict[@"DoubleKey"]);
    XCTAssertEqualObjects(result[@"StringKey"], self.dict[@"StringKey"]);
    XCTAssertEqualObjects(result[@"BoolKey"], self.dict[@"BoolKey"]);
    XCTAssertEqualObjects(result[@"ArrayKey"], self.dict[@"ArrayKey"]);
}

- (void)testPerformanceHBDict
{
    NSDictionary *dict = self.dict;

    [self measureBlock:^{
        for (int i = 0; i < 10000; i++)
        {
            hb_dict_t *result = dict.hb_value;
            hb_dict_free(&result);
        }
    }];
}

- (void)testPerformanceNSDictionary
{
    NSDictionary *dict = self.dict;
    hb_dict_t *hbdict = dict.hb_value;

    [self measureBlock:^{
        for (int i = 0; i < 10000; i++)
        {
            __unused NSDictionary *result =  [[NSDictionary alloc] initWithHBDict:hbdict];
        }
    }];
}

@end
