/*
 * Unit tests for the preferences manager
 */

import "package:test/test.dart";
import "package:inventree/preferences.dart";

void main() {

  setUp(() async {
  });

  group("Settings Tests:", () {
    test("Default Values", () async {
      // Boolean values
      expect(await InvenTreeSettingsManager().getBool("test", false), equals(false));
      expect(await InvenTreeSettingsManager().getBool("test", true), equals(true));

      // String values
      expect(await InvenTreeSettingsManager().getValue("test", "x"), equals("x"));
    });

    test("Set value", () async {
      await InvenTreeSettingsManager().setValue("abc", "xyz");

      expect(await InvenTreeSettingsManager().getValue("abc", "123"), equals("xyz"));
    });

    test("Booleans", () async {
      // Tests for boolean values

      await InvenTreeSettingsManager().removeValue("chicken");

      // Use default values when a setting does not exist
      assert(await InvenTreeSettingsManager().getBool("chicken", true) == true);
      assert(await InvenTreeSettingsManager().getBool("chicken", false) == false);

      // Explicitly set to true
      await InvenTreeSettingsManager().setValue("chicken", true);
      assert(await InvenTreeSettingsManager().getBool("chicken", false) == true);

      // Explicitly set to false
      await InvenTreeSettingsManager().setValue("chicken", false);
      assert(await InvenTreeSettingsManager().getBool("chicken", true) == false);

    });

    test("Tri State", () async {
      // Tests for tristate values

      await InvenTreeSettingsManager().removeValue("dog");

      // Use default values when a setting does not exist
      for (bool? value in [true, false, null]) {
        assert(await InvenTreeSettingsManager().getTriState("dog", value) == value);
      }

      // Explicitly set to a value
      for (bool? value in [true, false, null]) {
        await InvenTreeSettingsManager().setValue("dog", value);

        assert(await InvenTreeSettingsManager().getTriState("dog", true) == value);
        assert(await InvenTreeSettingsManager().getTriState("dog", false) == value);
        assert(await InvenTreeSettingsManager().getTriState("dog", null) == value);
      }
    });
  });
}