summaryrefslogtreecommitdiff
path: root/test/optparse/test_load.rb
blob: 0ebe855682a6c494150712aaf745a615ee80d0b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# frozen_string_literal: false
require 'test/unit'
require 'optparse'
require 'tmpdir'

class TestOptionParserLoad < Test::Unit::TestCase
  def setup
    @tmpdir = Dir.mktmpdir("optparse_test-")
    @basename = File.basename($0, '.*')
    @envs = %w[HOME XDG_CONFIG_HOME XDG_CONFIG_DIRS].each_with_object({}) do |v, h|
      h[v] = ENV.delete(v)
    end
  end

  def teardown
    ENV.update(@envs)
    FileUtils.rm_rf(@tmpdir)
  end

  def new_parser
    @result = nil
    OptionParser.new do |opt|
      opt.on("--test=arg") {|v| @result = v}
    end
  end

  def assert_load(result)
    assert new_parser.load
    assert_equal(result, @result)
    assert new_parser.load(into: into = {})
    assert_equal({test: result}, into)
  end

  def setup_options(env, dir, suffix = nil)
    optdir = File.join(@tmpdir, dir)
    FileUtils.mkdir_p(optdir)
    file = File.join(optdir, [@basename, suffix].join(""))
    File.write(file, "--test=#{dir}")
    ENV.update(env)
    if block_given?
      begin
        yield dir, optdir
      ensure
        File.unlink(file)
        Dir.rmdir(optdir) rescue nil
      end
    else
      return dir, optdir
    end
  end

  def setup_options_home(&block)
    setup_options({'HOME'=>@tmpdir}, ".options", &block)
  end

  def setup_options_xdg_config_home(&block)
    setup_options({'XDG_CONFIG_HOME'=>@tmpdir+"/xdg"}, "xdg", ".options", &block)
  end

  def setup_options_home_config(&block)
    setup_options({'HOME'=>@tmpdir}, ".config", ".options", &block)
  end

  def setup_options_xdg_config_dirs(&block)
    setup_options({'XDG_CONFIG_DIRS'=>@tmpdir+"/xdgconf"}, "xdgconf", ".options", &block)
  end

  def setup_options_home_config_settings(&block)
    setup_options({'HOME'=>@tmpdir}, "config/settings", ".options", &block)
  end

  def test_load_home_options
    result, = setup_options_home
    assert_load(result)

    setup_options_xdg_config_home do
      assert_load(result)
    end

    setup_options_home_config do
      assert_load(result)
    end

    setup_options_xdg_config_dirs do
      assert_load(result)
    end

    setup_options_home_config_settings do
      assert_load(result)
    end
  end

  def test_load_xdg_config_home
    result, = setup_options_xdg_config_home
    assert_load(result)

    setup_options_home_config do
      assert_load(result)
    end

    setup_options_xdg_config_dirs do
      assert_load(result)
    end

    setup_options_home_config_settings do
      assert_load(result)
    end
  end

  def test_load_home_config
    result, = setup_options_home_config
    assert_load(result)

    setup_options_xdg_config_dirs do
      assert_load(result)
    end

    setup_options_home_config_settings do
      assert_load(result)
    end
  end

  def test_load_xdg_config_dirs
    result, = setup_options_xdg_config_dirs
    assert_load(result)

    setup_options_home_config_settings do
      assert_load(result)
    end
  end

  def test_load_home_config_settings
    result, = setup_options_home_config_settings
    assert_load(result)
  end

  def test_load_nothing
    assert !new_parser.load
    assert_nil @result
  end
end