summaryrefslogtreecommitdiff
path: root/test/parser_test.rb
blob: bbdc4a93f684c190f5654ef81a7b1d68be99200e (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
142
143
144
145
require 'test_helper'
require 'shellwords'

describe Slop::Parser do
  before do
    @options = Slop::Options.new
    @verbose = @options.bool "-v", "--verbose"
    @name    = @options.string "-n", "--name"
    @unused  = @options.string "--unused"
    @parser  = Slop::Parser.new(@options)
    @result  = @parser.parse %w(foo -v --name lee argument)
  end

  it "ignores everything after --" do
    @parser.parse %w(-v -- -v --name lee)
    assert_equal [@verbose], @parser.used_options
    assert_equal ["-v", "--name", "lee"], @parser.arguments
  end

  describe "for flag=argument" do
    it "parses names and values" do
      @options.integer "-p", "--port"
      @result.parser.parse %w(--name=bob -p=123)
      assert_equal "bob", @result[:name]
      assert_equal 123, @result[:port]
    end

    it "treats an = separated by a space as a value" do
      @options.string "--foo"
      @result.parser.parse %w(--foo = =)
      assert_equal "=", @result[:foo]
      assert_equal %w(=), @result.args
    end

    it "includes = in strings" do
      @result.parser.parse(%w(--name=b=b))
      assert_equal "b=b", @result[:name]
    end
  end

  it "parses flag=''" do
    @options.string "--str"
    @options.array "--arr", default: ["array"]
    @result.parser.parse %(--str="" --arr="").shellsplit

    assert_equal "", @result[:str]
    assert_equal [], @result[:arr]
  end

  it "parses arg with leading -" do
    @options.string "-t", "--text"
    @result.parser.parse %w(--name=bob --text --sometext)
    assert_equal "bob", @result[:name]
    assert_equal "--sometext", @result[:text]
  end

  it "parses regexp arg with leading -" do
    @options.regexp "--pattern"
    @result.parser.parse %w(--pattern -x)
    assert_equal(/-x/, @result[:pattern])
  end

  it "parses negative integer" do
    @options.integer "-p", "--port"
    @result.parser.parse %w(--name=bob --port -123)
    assert_equal "bob", @result[:name]
    assert_equal(-123, @result[:port])
  end

  it "parses negative float" do
    @options.float "-m", "--multiple"
    @result.parser.parse %w(--name=bob -m -123.987)
    assert_equal "bob", @result[:name]
    assert_equal(-123.987, @result[:multiple])
  end

  describe "parsing grouped short flags" do
    before do
      @options.bool "-q", "--quiet"
    end

    it "parses boolean flags" do
      @result.parser.parse %w(-qv)
      assert_equal true, @result.quiet?
      assert_equal true, @result.verbose?
    end

    it "sends the argument to the last flag" do
      @result.parser.parse %w(-qvn foo)
      assert_equal "foo", @result[:name]
    end

    it "doesn't screw up single hyphen long options" do
      @options.string "-host"
      @result.parser.parse %w(-host localhost)
      assert_equal "localhost", @result[:host]
    end
  end

  describe "short flags with arguments" do
    before do
      @options.integer "-i"
      @options.string "-s"
    end

    it "parses the argument" do
      @result.parser.parse %w(-i5 -sfoo)
      assert_equal 5, @result[:i]
      assert_equal "foo", @result[:s]
    end
  end

  describe "#used_options" do
    it "returns all options that were parsed" do
      assert_equal [@verbose, @name], @parser.used_options
    end
  end

  describe "#unused_options" do
    it "returns all options that were not parsed" do
      assert_equal [@unused], @parser.unused_options
    end
  end

  describe "#arguments" do
    it "returns all unparsed arguments" do
      assert_equal %w(foo argument), @parser.arguments
    end

    it "does not return --" do
      @parser.parse %w(-v -- --name lee)
      assert_equal %w(--name lee), @parser.arguments
    end

    it "correctly removes the option argument" do
      @parser.parse %w(lee --name lee lee)
      assert_equal %w(lee lee), @parser.arguments
    end

    it "correctly removes options that use =" do
      @parser.parse %w(lee --name=lee lee)
      assert_equal %w(lee lee), @parser.arguments
    end
  end
end