+
Skip to content

xor, required and and don't work together #516

Open
@rustycl0ck

Description

@rustycl0ck

If a required tag is attached to one of the flags, there is no error even when the flag is not passed.

Test case:

  func TestXorAndRequired(t *testing.T) {
    var cli struct {
      Hello string `xor:"hello" required:""`
      One   string `xor:"hello" and:"two"`
      Two   string `and:"two"`
    }

    p := mustNew(t, &cli)
    _, err := p.Parse([]string{})
    assert.EqualError(t, err, "missing flags: --hello=STRING or --one=STRING, --one=STRING and --two=STRING")
  }

Error:

$ go test ./...
--- FAIL: TestXorAndRequired (0.00s)
    kong_test.go:1195: Expected an error
FAIL
FAIL    github.com/alecthomas/kong      0.597s
FAIL
Full test case
func TestXorAndRequired(t *testing.T) {
        var cli struct {
                Hello string `xor:"hello" required:""`
                One   string `xor:"hello" and:"two"`
                Two   string `and:"two"`
        }

        p := mustNew(t, &cli)
        _, err := p.Parse([]string{})
        assert.EqualError(t, err, "missing flags: --hello=STRING or --one=STRING, --one=STRING and --two=STRING")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--one=valOne"})
        assert.EqualError(t, err, "--one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--two=valTwo"})
        assert.EqualError(t, err, "--one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello", "--one=valOne"})
        assert.EqualError(t, err, "--hello and --one can't be used together, --one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello", "--two=valTwo"})
        assert.EqualError(t, err, "--one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello", "--one=valOne", "--two=valTwo"})
        assert.EqualError(t, err, "--hello and --one can't be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello"})
        assert.NoError(t, err)

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--one=valOne", "--two=valTwo"})
        assert.NoError(t, err)
}

func TestXorAndRequiredMany(t *testing.T) {
        var cli struct {
                Hello string `required:"" xor:"hello"`
                One   string `required:"" xor:"hello" and:"two"`
                Two   string `required:"" and:"two"`
        }

        p := mustNew(t, &cli)
        _, err := p.Parse([]string{})
        assert.EqualError(t, err, "missing flags: --hello=STRING or --one=STRING, --one=STRING and --two=STRING")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--one=valOne"})
        assert.EqualError(t, err, "--one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--two=valTwo"})
        assert.EqualError(t, err, "--one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello", "--one=valOne"})
        assert.EqualError(t, err, "--hello and --one can't be used together, --one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello", "--two=valTwo"})
        assert.EqualError(t, err, "--one and --two must be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello", "--one=valOne", "--two=valTwo"})
        assert.EqualError(t, err, "--hello and --one can't be used together")

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--hello=valHello"})
        assert.NoError(t, err)

        p = mustNew(t, &cli)
        _, err = p.Parse([]string{"--one=valOne", "--two=valTwo"})
        assert.NoError(t, err)
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载