summaryrefslogtreecommitdiff
path: root/test/result_test.rb
blob: c992f405acb64477872b4dc1316340792d508469 (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
require 'test_helper'

module Slop
  class ReverseEverythingOption < BoolOption
    def finish(result)
      result.used_options.grep(Slop::StringOption).each do |opt|
        opt.value = opt.value.reverse
      end
    end
  end
end

describe Slop::Result do
  before do
    @options     = Slop::Options.new
    @verbose     = @options.bool "-v", "--verbose"
    @name        = @options.string "--name"
    @unused      = @options.string "--unused"
    @long_option = @options.string "--long-option"
    @result      = @options.parse %w(foo -v --name lee --long-option bar argument)
  end

  it "increments option count" do
    # test this here so it's more "full stack"
    assert_equal 1, @verbose.count
    assert_equal 1, @long_option.count
    @result.parser.parse %w(-v --verbose)
    assert_equal 2, @verbose.count
  end

  it "handles default values" do
    @options.string("--foo", default: "bar")
    @result.parser.parse %w()
    assert_equal "bar", @result[:foo]

    @result.parser.parse %w(--foo)
    assert_equal "bar", @result[:foo]
  end

  it "handles custom finishing" do
    @options.string "--foo"
    @options.reverse_everything "-r"
    @result.parser.parse %w(-r --name lee --foo bar)
    assert_equal %w(eel rab), @result.to_hash.values_at(:name, :foo)
  end

  it "yields arguments to option blocks" do
    output = nil
    @options.string("--foo") { |v| output = v }
    @result.parser.parse %w(--foo bar)
    assert_equal output, "bar"
  end

  describe "#[]" do
    it "returns an options value" do
      assert_equal "lee", @result["name"]
      assert_equal "lee", @result[:name]
      assert_equal "lee", @result["--name"]
      assert_equal "bar", @result["long_option"]
      assert_equal "bar", @result[:long_option]
      assert_equal "bar", @result["--long-option"]
    end
  end

  describe "#fetch" do
    it "returns an options value" do
      assert_equal "lee", @result.fetch("--name")
    end

    it "raises Slop::UnknownOption when an option does not exists" do
      e = assert_raises(Slop::UnknownOption) { @result.fetch("--unexisting") }
      assert_equal "option not found: 'unexisting'", e.message
    end

    it "returns the default value of an option when a value is not provided" do
      @options.string("--foo", default: "bar")
      @result.parser.parse %w(--foo)

      assert_equal 'bar', @result.fetch('foo')
    end

    it "returns nil when an option is not provided and it does not have a default value" do
      @options.string("--hello")
      @result.parser.parse %w()

      assert_nil @result.fetch('hello')
    end
  end

  describe "#[]=" do
    it "sets an options value" do
      assert_equal "lee", @result["name"]
      @result["name"] = "bob"
      assert_equal "bob", @result[:name]
    end

    it "raises if an option isn't found" do
      assert_raises ArgumentError do
        @result["zomg"] = "something"
      end
    end
  end

  describe "#method_missing" do
    it "checks if options have been used" do
      assert_equal true, @result.verbose?
      assert_equal false, @result.unused?
      assert_equal true, @result.long_option?
    end
  end

  describe "#option" do
    it "returns an option by flag" do
      assert_equal @verbose, @result.option("--verbose")
      assert_equal @verbose, @result.option("-v")
      assert_equal @long_option, @result.option("--long-option")
    end

    it "ignores prefixed hyphens" do
      assert_equal @verbose, @result.option("verbose")
      assert_equal @verbose, @result.option("-v")
    end

    it "returns nil if nothing is found" do
      assert_nil @result.option("foo")
    end
  end

  describe "#to_hash" do
    it "returns option keys and values" do
      assert_equal({ verbose: true, name: "lee", unused: nil, long_option: "bar" },
                   @result.to_hash)
    end
  end
end