channel_buffer_tests.rs

 1use crate::tests::TestServer;
 2
 3use channel::channel_buffer::ChannelBuffer;
 4use gpui::{executor::Deterministic, ModelHandle, TestAppContext};
 5use std::{ops::Range, sync::Arc};
 6
 7#[gpui::test]
 8async fn test_channel_buffers(
 9    deterministic: Arc<Deterministic>,
10    cx_a: &mut TestAppContext,
11    cx_b: &mut TestAppContext,
12) {
13    deterministic.forbid_parking();
14    let mut server = TestServer::start(&deterministic).await;
15    let client_a = server.create_client(cx_a, "user_a").await;
16    let client_b = server.create_client(cx_b, "user_b").await;
17
18    let zed_id = server
19        .make_channel("zed", (&client_a, cx_a), &mut [(&client_b, cx_b)])
20        .await;
21
22    let a_document =
23        cx_a.add_model(|cx| ChannelBuffer::for_channel(zed_id, client_a.client().to_owned(), cx));
24    let channel_buffer_a = a_document
25        .update(cx_a, |doc, cx| doc.buffer(cx))
26        .await
27        .unwrap();
28
29    edit_channel_buffer(&channel_buffer_a, cx_a, [(0..0, "hello world")]);
30    edit_channel_buffer(&channel_buffer_a, cx_a, [(5..5, ", cruel")]);
31    edit_channel_buffer(&channel_buffer_a, cx_a, [(0..5, "goodbye")]);
32    undo_channel_buffer(&channel_buffer_a, cx_a);
33
34    assert_eq!(
35        channel_buffer_text(&channel_buffer_a, cx_a),
36        "hello, cruel world"
37    );
38
39    let b_document =
40        cx_b.add_model(|cx| ChannelBuffer::for_channel(zed_id, client_b.client().to_owned(), cx));
41    let channel_buffer_b = b_document
42        .update(cx_b, |doc, cx| doc.buffer(cx))
43        .await
44        .unwrap();
45
46    assert_eq!(
47        channel_buffer_text(&channel_buffer_b, cx_b),
48        "hello, cruel world"
49    );
50
51    edit_channel_buffer(&channel_buffer_b, cx_b, [(7..12, "beautiful")]);
52
53    deterministic.run_until_parked();
54
55    assert_eq!(
56        channel_buffer_text(&channel_buffer_a, cx_a),
57        "hello, beautiful world"
58    );
59    assert_eq!(
60        channel_buffer_text(&channel_buffer_b, cx_b),
61        "hello, beautiful world"
62    );
63}
64
65fn edit_channel_buffer<I>(
66    channel_buffer: &ModelHandle<language::Buffer>,
67    cx: &mut TestAppContext,
68    edits: I,
69) where
70    I: IntoIterator<Item = (Range<usize>, &'static str)>,
71{
72    channel_buffer.update(cx, |buffer, cx| buffer.edit(edits, None, cx));
73}
74
75fn undo_channel_buffer(channel_buffer: &ModelHandle<language::Buffer>, cx: &mut TestAppContext) {
76    channel_buffer.update(cx, |buffer, cx| buffer.undo(cx));
77}
78
79fn channel_buffer_text(
80    channel_buffer: &ModelHandle<language::Buffer>,
81    cx: &mut TestAppContext,
82) -> String {
83    channel_buffer.read_with(cx, |buffer, _| buffer.text())
84}