// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/unit_conversion/model/unit_conversion_service.h"

#import "ios/chrome/test/providers/unit_conversion/test_unit_conversion.h"
#import "testing/platform_test.h"

// A Unit Conversion factory that return test source and target units.
@interface TestUnitConversionProviderTestHelperService
    : NSObject <UnitConversionProviderTestHelper>
@end

@implementation TestUnitConversionProviderTestHelperService

- (NSUnit*)sourceUnitFromUnitType:(ios::provider::UnitType)unit_type {
  return nil;
}

- (NSUnit*)targetUnitFromUnit:(NSUnit*)unit {
  return [NSUnitMass grams];
}

@end

// Test the Unit Conversion Service.
class UnitConversionServiceTest : public PlatformTest {
 public:
  void SetUp() override {
    helper_ = [[TestUnitConversionProviderTestHelperService alloc] init];
    ios::provider::test::SetUnitConversionProviderTestHelper(helper_);
  }

  void TearDown() override {
    service_.Shutdown();
    ios::provider::test::SetUnitConversionProviderTestHelper(nil);
    PlatformTest::TearDown();
  }

 protected:
  UnitConversionService service_;
  TestUnitConversionProviderTestHelperService* helper_;
};

// Tests that the default conversion is taking place (the provided conversion
// from `ios_internal`) when no update has been made to
// `default_conversion_cache_`.
TEST_F(UnitConversionServiceTest, TestDefaultConversionFromProvider) {
  EXPECT_EQ(service_.GetDefaultTargetFromUnit([NSUnitMass grams]),
            [NSUnitMass grams]);
  service_.UpdateDefaultConversionCache([NSUnitMass grams],
                                        [NSUnitMass kilograms]);
  EXPECT_EQ(service_.GetDefaultTargetFromUnit([NSUnitMass grams]),
            [NSUnitMass kilograms]);
}

// Tests that the default conversion is changed after adding an element to
// `default_conversion_cache_`.
TEST_F(UnitConversionServiceTest, TestUpdatedDefaultConversion) {
  EXPECT_EQ(service_.GetDefaultTargetFromUnit([NSUnitMass grams]),
            [NSUnitMass grams]);
  service_.UpdateDefaultConversionCache([NSUnitMass grams],
                                        [NSUnitMass kilograms]);
  EXPECT_EQ(service_.GetDefaultTargetFromUnit([NSUnitMass grams]),
            [NSUnitMass kilograms]);
}
