| # Walkthrough: adding a new test |
| |
| This chapter gives an example of a small change that you could make as your first contribution to Rust, |
| using [rust#59333] and [rust#161442] as an example. |
| |
| [rust#59333]: https://github.com/rust-lang/rust/issues/59333 |
| [rust#161442]: https://github.com/rust-lang/rust/issues/161442 |
| |
| ## Find an `E-needs-test` issue to work on |
| |
| See ["What should I work on?"](../getting-started.md#What-should-I-work-on) for a list of possible tasks you could try out. |
| Here, we've chosen an `E-needs-test` issue: |
| [rust#59333](https://github.com/rust-lang/rust/issues/59333). |
| This is an especially good fit because it has an example |
| [directly in the issue](https://github.com/rust-lang/rust/issues/59333#issuecomment-555973113), |
| without needing additional work from you to minimize the bug. |
| Of course, it's always very helpful for you to take `E-needs-test` that *doesn't* have a minimal example and create one. |
| |
| ## Reproduce the issue |
| |
| The example here was posted in 2019, fully 7 years ago (at time of writing). |
| Quite a lot of things change in the compiler in that period of time. |
| To make sure the test is still accurate, *reproduce it with the most recent compiler*. |
| An easy way to do this is with [play.rust-lang.org](https://play.rust-lang.org/?version=nightly) on the `nightly` branch, |
| or [rust.godbolt.org](https://rust.godbolt.org/) with `rustc nightly`. |
| You can also use `rustc +nightly` locally if you need complicated setup that isn't possible on Playground. |
| |
| ## Convert the issue to a test |
| |
| Check out and set up the `rust-lang/rust` repo, as documented in [Quickstart](../building/quickstart.md): |
| |
| ```console |
| $ git clone https://github.com/rust-lang/rust |
| $ cd rust |
| $ ./x setup compiler |
| $ ./x build library |
| ``` |
| |
| Here, we use `compiler` as the default profile, since the bug we're fixing is related to the compiler. |
| If you're adding a unit test to the standard library, you'd use `./x setup library`. |
| |
| This will also suggest setting up a [`.git/hooks/pre-push` check][pre-push]. |
| This is optional, but recommended. |
| |
| [pre-push]: ../building/suggested.md#installing-a-pre-push-hook |
| |
| We also started a build in the background with `./x build library`. |
| Rust unfortunately takes quite a while to build, |
| so starting a build early lets it run in the background while you're working on other things. |
| |
| See [UI tests](../tests/ui.md) for a guide on adding new tests. |
| In rare cases, you may need a [run-make](../tests/compiletest.md#run-make-tests) or even more specialized kind of test. |
| See [Compiletest](../tests/compiletest.md) for more information. |
| |
| In our case, our test is fairly simple: |
| |
| ```rust |
| // Save this file to `tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs`. |
| |
| //@ check-pass |
| //! Regression test for <https://github.com/rust-lang/rust/issues/59333>. |
| //! A type alias used only as (part of) the self type of an impl was |
| //! incorrectly flagged as dead code. |
| |
| #![deny(dead_code)] |
| |
| struct Runner; |
| |
| type RuntimeImpl = Runner; |
| |
| trait Runtime { |
| fn run(&mut self); |
| } |
| |
| impl Runtime for &mut RuntimeImpl { |
| fn run(&mut self) {} |
| } |
| |
| struct Walker; |
| |
| type WalkerImpl = Walker; |
| |
| trait Walk { |
| fn walk(&self) {} |
| } |
| |
| impl Walk for WalkerImpl {} |
| |
| fn main() { |
| let mut runner = Runner; |
| (&mut runner).run(); |
| Walker.walk(); |
| } |
| ``` |
| |
| Most of the details here don't matter too much, but note the `//@ check-pass` and `#![deny(dead_code)]` at the top. |
| Together, those ensure that the compiler doesn't emit a `dead_code` lint when compiling this file. |
| |
| Also note the "Regression test for ..." comment. |
| This is *very* helpful for your reviewer, since it helps them understand what the test is doing and whether there's a simpler way to test the behavior. |
| Please do your best to write a complete description for the test. |
| |
| Run your test. |
| [rust#161442] named its test `tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs`, |
| so you could run: |
| |
| ``` |
| ./x test tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs |
| ``` |
| |
| If that passes, your test is ready. |
| |
| ## Open a PR |
| |
| Follow the instructions in [PR lifecycle](../pr-lifecycle.md). |
| |
| First, run the pre-push check if you didn't set it up earlier: |
| |
| ```sh |
| ./x test tidy |
| ``` |
| |
| Then, [open the PR](https://guides.github.com/activities/forking/#making-a-pull-request): |
| |
| ``` |
| git switch --create issue-59333-test |
| git add tests/ui/lint/dead-code/type-alias-used-in-impl-59333.rs |
| git commit |
| git remote add personal https://github.com/YOUR_USERNAME_HERE/rust.git |
| git push --set-upstream personal issue-59333-test |
| ``` |
| |
| ## Review and feedback |
| |
| See [PR lifecycle](../pr-lifecycle.md) for information about review and merging. |