# Copyright (C) 2016  Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

class TestSettings < Test::Unit::TestCase
  include GioTestUtils::Fixture
  include GioTestUtils::Omissions

  sub_test_case "accessor" do
    setup do
      @settings = Gio::Settings.new("jp.ruby-gnome2.test.settings")
    end

    test "string" do
      @settings.reset("string")
      assert_equal("default-string",
                   @settings["string"])
      @settings["string"] = "new-string"
      assert_equal("new-string",
                   @settings["string"])
    end

    test "boolean" do
      @settings.reset("boolean")
      assert_equal(true,
                   @settings["boolean"])
      @settings["boolean"] = false
      assert_equal(false,
                   @settings["boolean"])
    end
  end

  sub_test_case ".new" do
    def need_keyfile_settings_backend
      unless Gio.respond_to?(:keyfile_settings_backend_new)
        omit("Need Gio.keyfile_settings_backend_new")
      end
    end

    test "minimum" do
      settings = Gio::Settings.new("jp.ruby-gnome2.test.settings")
      settings.reset("string")
      assert_equal("default-string", settings["string"])
    end

    test ":path" do
      settings = Gio::Settings.new("jp.ruby-gnome2.test.settings",
                                   :path => "/jp/ruby-gnome2/test/settings/")
      settings.reset("string")
      assert_equal("default-string", settings["string"])
    end

    test ":backend" do
      need_keyfile_settings_backend
      keyfile = Tempfile.new(["settings", ".ini"])
      backend = Gio::keyfile_settings_backend_new(keyfile.path, "/", "keyfile_settings")
      settings = Gio::Settings.new("jp.ruby-gnome2.test.settings",
                                   :backend => backend)

      settings.reset("string")
      assert_equal("default-string", settings["string"])
      settings["string"] = "new-string"
      assert_equal("new-string", settings["string"])

      keyfile_content_ref = <<-KEYFILE
[jp/ruby-gnome2/test/settings]
string='new-string'
      KEYFILE
      keyfile_content = File.read(keyfile.path)
      assert_equal(keyfile_content_ref, keyfile_content)
      FileUtils.rm_f(keyfile)
    end

    test ":backend and :path" do
      need_keyfile_settings_backend
      keyfile = Tempfile.new(["settings", ".ini"])
      backend = Gio::keyfile_settings_backend_new(keyfile.path, "/", "keyfile_settings")
      settings = Gio::Settings.new("jp.ruby-gnome2.test.settings",
                                   :backend => backend,
                                   :path => "/jp/ruby-gnome2/test/settings/")

      settings.reset("string")
      assert_equal("default-string", settings["string"])
      settings["string"] = "new-string"
      assert_equal("new-string", settings["string"])

      keyfile_content_ref = <<-KEYFILE
[jp/ruby-gnome2/test/settings]
string='new-string'
      KEYFILE
      keyfile_content = File.read(keyfile.path)
      assert_equal(keyfile_content_ref, keyfile_content)
    end

    test "full" do
      need_keyfile_settings_backend
      keyfile = Tempfile.new(["settings", ".ini"])
      backend = Gio::keyfile_settings_backend_new(keyfile.path, "/", "keyfile_settings")
      schema_dir = fixture_path("schema", "default")
      schema_source = Gio::SettingsSchemaSource.new(schema_dir,
                                                    nil,
                                                    true)
      schema = schema_source.lookup("jp.ruby-gnome2.test.settings", true)
      settings = Gio::Settings.new(schema,
                                   backend,
                                   "/jp/ruby-gnome2/test/settings/")

      settings.reset("string")
      assert_equal("default-string", settings["string"])
      settings["string"] = "new-string"
      assert_equal("new-string", settings["string"])

      keyfile_content_ref = <<-KEYFILE
[jp/ruby-gnome2/test/settings]
string='new-string'
      KEYFILE
      keyfile_content = File.read(keyfile.path)
      assert_equal(keyfile_content_ref, keyfile_content)
    end
  end
end
