Reviewed-on: #18 Co-authored-by: Ren Amamiya <reya@lume.nu> Co-committed-by: Ren Amamiya <reya@lume.nu>
95 lines
2.4 KiB
Markdown
95 lines
2.4 KiB
Markdown
---
|
|
name: gpui-test
|
|
description: Writing tests for GPUI applications. Use when testing components, async operations, or UI behavior.
|
|
---
|
|
|
|
## Overview
|
|
|
|
GPUI provides a comprehensive testing framework that allows you to test UI components, async operations, and distributed systems. Tests run on a single-threaded executor that provides deterministic execution and the ability to test complex async scenarios. GPUI tests use the `#[gpui::test]` attribute and work with `TestAppContext` for basic testing and `VisualTestContext` for window-dependent tests.
|
|
|
|
### Rules
|
|
|
|
- If test does not require windows or rendering, we can avoid use `[gpui::test]` and `TestAppContext`, just write simple rust test.
|
|
|
|
## Core Testing Infrastructure
|
|
|
|
### Test Attributes
|
|
|
|
#### Basic Test
|
|
|
|
```rust
|
|
#[gpui::test]
|
|
fn my_test(cx: &mut TestAppContext) {
|
|
// Test implementation
|
|
}
|
|
```
|
|
|
|
#### Async Test
|
|
|
|
```rust
|
|
#[gpui::test]
|
|
async fn my_async_test(cx: &mut TestAppContext) {
|
|
// Async test implementation
|
|
}
|
|
```
|
|
|
|
#### Property Test with Iterations
|
|
|
|
```rust
|
|
#[gpui::test(iterations = 10)]
|
|
fn my_property_test(cx: &mut TestAppContext, mut rng: StdRng) {
|
|
// Property testing with random data
|
|
}
|
|
```
|
|
|
|
### Test Contexts
|
|
|
|
#### TestAppContext
|
|
|
|
`TestAppContext` provides access to GPUI's core functionality without windows:
|
|
|
|
```rust
|
|
#[gpui::test]
|
|
fn test_entity_operations(cx: &mut TestAppContext) {
|
|
// Create entities
|
|
let entity = cx.new(|cx| MyComponent::new(cx));
|
|
|
|
// Update entities
|
|
entity.update(cx, |component, cx| {
|
|
component.value = 42;
|
|
cx.notify();
|
|
});
|
|
|
|
// Read entities
|
|
let value = entity.read_with(cx, |component, _| component.value);
|
|
assert_eq!(value, 42);
|
|
}
|
|
```
|
|
|
|
#### VisualTestContext
|
|
|
|
`VisualTestContext` extends `TestAppContext` with window support:
|
|
|
|
```rust
|
|
#[gpui::test]
|
|
fn test_with_window(cx: &mut TestAppContext) {
|
|
// Create window with component
|
|
let window = cx.update(|cx| {
|
|
cx.open_window(Default::default(), |_, cx| {
|
|
cx.new(|cx| MyComponent::new(cx))
|
|
}).unwrap()
|
|
});
|
|
|
|
// Convert to visual context
|
|
let mut cx = VisualTestContext::from_window(window.into(), cx);
|
|
|
|
// Access window and component
|
|
let component = window.root(&mut cx).unwrap();
|
|
}
|
|
```
|
|
|
|
## Additional Resources
|
|
|
|
- For detailed testing patterns and examples, see [reference.md](reference.md)
|
|
- For best practices and running tests, see [examples.md](examples.md)
|