Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

reftests: add test for operators in opamfile filters #5642

Merged
merged 1 commit into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions master_changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ users)
* Set `opam-version` to 2.2 for some conflict message tests based on opam repository to stabilise their output [#6045 @rjbou]
* [BUG]: head -c is not posix compliant. Use cut -b instead. [#5989 @madroach]
* Add bad cudf package name encoding (dose3 lib) [#6055 @rjbou]
* Add test for filter operators in opam file [#5642 @rjbou]

### Engine

Expand Down
18 changes: 18 additions & 0 deletions tests/reftests/dune.inc
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,24 @@
%{targets}
(run ./run.exe %{exe:../../src/client/opamMain.exe.exe} %{dep:extrasource.test} %{read-lines:testing-env}))))

(rule
(alias reftest-filter-operators)
(action
(diff filter-operators.test filter-operators.out)))

(alias
(name reftest)
(deps (alias reftest-filter-operators)))

(rule
(targets filter-operators.out)
(deps root-N0REP0)
(package opam)
(action
(with-stdout-to
%{targets}
(run ./run.exe %{exe:../../src/client/opamMain.exe.exe} %{dep:filter-operators.test} %{read-lines:testing-env}))))

(rule
(alias reftest-init-ocaml-eval-variables.unix)
(enabled_if (= %{os_type} "Unix"))
Expand Down
327 changes: 327 additions & 0 deletions tests/reftests/filter-operators.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,327 @@
N0REP0
### : Test filter operators :
### OPAMSTRICT=0
### <pkg:ok.1>
opam-version: "2.0"
### <pkg:a.1>
opam-version: "2.0"
### <pkg:b.1>
opam-version: "2.0"
### <pkg:c.1>
opam-version: "2.0"
### <pkg:ko.1>
opam-version: "2.0"
### <pkg:ko-bool.1>
opam-version: "2.0"
### <pkg:ko-int.1>
opam-version: "2.0"
### <pkg:ko-string.1>
opam-version: "2.0"
### <pkg:error.1>
opam-version: "2.0"
### opam switch create operators --empty
### OPAMSHOW=1
### :: undefined ::
### <pkg:undefined.1>
opam-version: "2.0"
depends: [
"ok"
"a" { ?defin }
]
### opam install undefined
The following actions would be performed:
=== install 2 packages
- install ok 1 [required by undefined]
- install undefined 1
### OPAMVAR_defin=something opam install undefined
The following actions would be performed:
=== install 3 packages
- install a 1 [required by undefined]
- install ok 1 [required by undefined]
- install undefined 1
### <pkg:undefined.1>
opam-version: "2.0"
depends: [
"ok"
"a" { ?(defined & undefined) }
]
### OPAMVAR_defined=something opam install undefined
The following actions would be performed:
=== install 2 packages
- install ok 1 [required by undefined]
- install undefined 1
### OPAMVAR_defined=something OPAMVAR_undefined=defined opam install undefined
The following actions would be performed:
=== install 2 packages
- install ok 1 [required by undefined]
- install undefined 1
### <pkg:undefined.1>
opam-version: "2.0"
depends: [
"ok"
"a" { undefined | true }
"b" { undefined & false }
]
### opam install undefined
The following actions would be performed:
=== install 3 packages
- install a 1 [required by undefined]
- install ok 1 [required by undefined]
- install undefined 1
### :: not ::
### <pkg:not.1>
opam-version: "2.0"
depends: [ "ok" "a" { !bvar } ]
### OPAMVAR_bvar=true opam install not
The following actions would be performed:
=== install 2 packages
- install not 1
- install ok 1 [required by not]
### OPAMVAR_bvar=false opam install not
The following actions would be performed:
=== install 3 packages
- install a 1 [required by not]
- install not 1
- install ok 1 [required by not]
### :: and ::
### <pkg:and.1>
opam-version: "2.0"
depends: [
"ok"
"a" { true & true }
"ko" { true & false }
"error" { false & false }
]
### opam install and
The following actions would be performed:
=== install 3 packages
- install a 1 [required by and]
- install and 1
- install ok 1 [required by and]
### :: or ::
### <pkg:or.1>
opam-version: "2.0"
depends: [
"ok"
"a" { true | true }
"b" { true | false }
"ko" { false | false }
]
### opam install or
The following actions would be performed:
=== install 4 packages
- install a 1 [required by or]
- install b 1 [required by or]
- install ok 1 [required by or]
- install or 1
### :: eq ::
### <pkg:eq.1>
opam-version: "2.0"
depends: [
"ok"
"a" { 2=2 }
"ko-int" { 2=3 }
"b" { "a" = "a" }
"ko-string" { "a" = "b" }
"c" { true = true }
"ko-bool" { true = false }
]
### opam install eq
The following actions would be performed:
=== install 5 packages
- install a 1 [required by eq]
- install b 1 [required by eq]
- install c 1 [required by eq]
- install eq 1
- install ok 1 [required by eq]
### :: neq ::
### <pkg:neq.1>
opam-version: "2.0"
depends: [
"ok"
"a" { 2!=3 }
"ko-int" { 2!=2 }
"b" { "a" != "b" }
"ko-string" { "b" != "b" }
"c" { true != false }
"ko-bool" { true != true }
]
### opam install neq
The following actions would be performed:
=== install 5 packages
- install a 1 [required by neq]
- install b 1 [required by neq]
- install c 1 [required by neq]
- install neq 1
- install ok 1 [required by neq]
### :: lt ::
### <pkg:lt.1>
opam-version: "2.0"
depends: [
"ok"
"a" { 2<3 }
"ko-int" { 3<2 }
"b" { "a" < "b" }
"ko-string" { "b" < "a" }
"c" { false < true }
"ko-bool" { true < false }
]
### opam install lt
The following actions would be performed:
=== install 5 packages
- install a 1 [required by lt]
- install b 1 [required by lt]
- install c 1 [required by lt]
- install lt 1
- install ok 1 [required by lt]
### :: lteq ::
### <pkg:lteq.1>
opam-version: "2.0"
depends: [
"ok"
"a" { 2<=3 & 2<=2 }
"ko-int" { 3<=2 }
"b" { "a" <= "b" & "a" <= "a" }
"ko-string" { "b" <= "a" }
"c" { false <= true & false <= false }
"ko-bool" { true <= false }
]
### opam install lteq
The following actions would be performed:
=== install 5 packages
- install a 1 [required by lteq]
- install b 1 [required by lteq]
- install c 1 [required by lteq]
- install lteq 1
- install ok 1 [required by lteq]
### :: gt ::
### <pkg:gt.1>
opam-version: "2.0"
depends: [
"ok"
"a" { 4>3 }
"ko-int" { 3>4 }
"b" { "d" > "b" }
"ko-string" { "b" > "d" }
"c" { true > false }
"ko-bool" { false > true }
]
### opam install gt
The following actions would be performed:
=== install 5 packages
- install a 1 [required by gt]
- install b 1 [required by gt]
- install c 1 [required by gt]
- install gt 1
- install ok 1 [required by gt]
### :: gteq ::
### <pkg:gteq.1>
opam-version: "2.0"
depends: [
"ok"
"a" { 4>=3 & 4>=4 }
"ko-int" { 3>=4 }
"b" { "d" >= "b" & "d" >= "d" }
"ko-string" { "b" >= "d" }
"c" { true >= false & true >= true }
"ko-bool" { false >= true }
]
### opam install gteq
The following actions would be performed:
=== install 5 packages
- install a 1 [required by gteq]
- install b 1 [required by gteq]
- install c 1 [required by gteq]
- install gteq 1
- install ok 1 [required by gteq]
### :: Combination ::
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's definitely good to have some tests for this, but I'm not sure that reftests are the correct harness? Wouldn't it be better to be testing the filter parser then evaluation of filters separately (alcotest-style or some such), rather than invoking the whole of opam machinery to test this?

I'm pretty sure the tests above this comment would definitely be clearer as a standard test case harness and I'm fairly even the tests below would be?

(i.e. I think the reftests framework is excellent for full-blown tests, but these feel more like unit tests and the framework's overkill for that?)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's fine to have in the reftest since it's something that is usable and most used from the command line tool

### <pkg:comb.1>
opam-version: "2.0"
depends: [
"ok"
"a" { false & false | true }
"ko" { false & (false | true) }
]
### opam install comb
The following actions would be performed:
=== install 3 packages
- install a 1 [required by comb]
- install comb 1
- install ok 1 [required by comb]
### :: Package combination ::
### <pkg:pkg-comb.1>
opam-version:"2.0"
messages: [
"this is a package"
"with all defined variables" { a+b:var }
]
### OPAMVAR_a_var=true OPAMVAR_b_var=false opam install pkg-comb
The following actions would be performed:
=== install 1 package
- install pkg-comb 1 this is a package
### OPAMVAR_a_var=false OPAMVAR_b_var=false opam install pkg-comb
The following actions would be performed:
=== install 1 package
- install pkg-comb 1 this is a package
### OPAMVAR_a_var=true OPAMVAR_b_var=true opam install pkg-comb
The following actions would be performed:
=== install 1 package
- install pkg-comb 1 this is a package
with all defined variables
### <pkg:pkg-comb-enable.1>
opam-version:"2.0"
post-messages: [
"packages a & b are %{a+b:enable}%"
]
### OPAMSHOW=0
### opam install pkg-comb-enable
The following actions will be performed:
=== install 1 package
- install pkg-comb-enable 1

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed pkg-comb-enable.1
Done.

<><> pkg-comb-enable.1 installed successfully <><><><><><><><><><><><><><><><><>
=> packages a & b are disable
### opam install a
The following actions will be performed:
=== install 1 package
- install a 1

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed a.1
Done.
### opam reinstall pkg-comb-enable
The following actions will be performed:
=== recompile 1 package
- recompile pkg-comb-enable 1

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> removed pkg-comb-enable.1
-> installed pkg-comb-enable.1
Done.

<><> pkg-comb-enable.1 installed successfully <><><><><><><><><><><><><><><><><>
=> packages a & b are disable
### opam install b
The following actions will be performed:
=== install 1 package
- install b 1

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed b.1
Done.
### opam reinstall pkg-comb-enable
The following actions will be performed:
=== recompile 1 package
- recompile pkg-comb-enable 1

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> removed pkg-comb-enable.1
-> installed pkg-comb-enable.1
Done.

<><> pkg-comb-enable.1 installed successfully <><><><><><><><><><><><><><><><><>
=> packages a & b are enable
Loading