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 channel_buffer_a = cx_a
23 .update(|cx| ChannelBuffer::for_channel(zed_id, client_a.client().to_owned(), cx))
24 .await
25 .unwrap();
26
27 let buffer_a = channel_buffer_a.read_with(cx_a, |buffer, _| buffer.buffer());
28
29 edit_channel_buffer(&buffer_a, cx_a, [(0..0, "hello world")]);
30 edit_channel_buffer(&buffer_a, cx_a, [(5..5, ", cruel")]);
31 edit_channel_buffer(&buffer_a, cx_a, [(0..5, "goodbye")]);
32 undo_channel_buffer(&buffer_a, cx_a);
33
34 assert_eq!(channel_buffer_text(&buffer_a, cx_a), "hello, cruel world");
35
36 let channel_buffer_b = cx_b
37 .update(|cx| ChannelBuffer::for_channel(zed_id, client_b.client().to_owned(), cx))
38 .await
39 .unwrap();
40
41 let buffer_b = channel_buffer_b.read_with(cx_b, |buffer, _| buffer.buffer());
42
43 assert_eq!(channel_buffer_text(&buffer_b, cx_b), "hello, cruel world");
44
45 edit_channel_buffer(&buffer_b, cx_b, [(7..12, "beautiful")]);
46
47 deterministic.run_until_parked();
48
49 assert_eq!(
50 channel_buffer_text(&buffer_a, cx_a),
51 "hello, beautiful world"
52 );
53 assert_eq!(
54 channel_buffer_text(&buffer_b, cx_b),
55 "hello, beautiful world"
56 );
57}
58
59fn edit_channel_buffer<I>(
60 channel_buffer: &ModelHandle<language::Buffer>,
61 cx: &mut TestAppContext,
62 edits: I,
63) where
64 I: IntoIterator<Item = (Range<usize>, &'static str)>,
65{
66 channel_buffer.update(cx, |buffer, cx| buffer.edit(edits, None, cx));
67}
68
69fn undo_channel_buffer(channel_buffer: &ModelHandle<language::Buffer>, cx: &mut TestAppContext) {
70 channel_buffer.update(cx, |buffer, cx| buffer.undo(cx));
71}
72
73fn channel_buffer_text(
74 channel_buffer: &ModelHandle<language::Buffer>,
75 cx: &mut TestAppContext,
76) -> String {
77 channel_buffer.read_with(cx, |buffer, _| buffer.text())
78}