blob: 70eff326a9f24c0d977776205d453770e414e00a [file] [view] [edit]
# 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.