lib/wayland/src/protocol/value/test.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const value = @import("root.zig");
3
4 const Decoder = value.Decoder;
5 const Encoder = value.Encoder;
6 const Fixed = value.Fixed;
7 const NewId = value.NewId;
8 const ObjectId = value.ObjectId;
9 const default_encoder_capacity = value.default_encoder_capacity;
10
11 test "typed protocol value namespace is complete" {
12 std.testing.refAllDecls(value);
13 }
14
15 test "all Wayland argument forms round trip with independent descriptors" {
16 const sys = @import("sys");
17 const protocol = @import("../root.zig");
18
19 const arguments = [_]protocol.schema.Argument{
20 .{ .name = "signed", .kind = .int, .interface = null, .enumeration = null, .nullable = false },
21 .{ .name = "unsigned", .kind = .uint, .interface = null, .enumeration = null, .nullable = false },
22 .{ .name = "fixed", .kind = .fixed, .interface = null, .enumeration = null, .nullable = false },
23 .{ .name = "string", .kind = .string, .interface = null, .enumeration = null, .nullable = false },
24 .{ .name = "nullable", .kind = .string, .interface = null, .enumeration = null, .nullable = true },
25 .{ .name = "object", .kind = .object, .interface = null, .enumeration = null, .nullable = false },
26 .{ .name = "optional", .kind = .object, .interface = null, .enumeration = null, .nullable = true },
27 .{ .name = "new", .kind = .new_id, .interface = "made", .enumeration = null, .nullable = false },
28 .{ .name = "array", .kind = .array, .interface = null, .enumeration = null, .nullable = false },
29 .{ .name = "descriptor", .kind = .fd, .interface = null, .enumeration = null, .nullable = false },
30 };
31 const metadata: protocol.schema.Message = .{
32 .name = "all",
33 .opcode = 3,
34 .since = 1,
35 .deprecated_since = null,
36 .destructor = false,
37 .signature = "iufs?sonah",
38 .descriptor_count = 1,
39 .minimum_payload_size = 44,
40 .arguments = &arguments,
41 };
42 const descriptor: sys.fd.Descriptor = 37;
43 var encoder = try Encoder.init(std.testing.allocator, default_encoder_capacity);
44 defer encoder.deinit();
45 try encoder.signed(-17);
46 try encoder.unsigned(42);
47 try encoder.fixed(Fixed.fromRaw(-129));
48 try encoder.string("hello");
49 try encoder.optionalString(null);
50 try encoder.object(try ObjectId.init(9));
51 try encoder.optionalObject(null);
52 try encoder.newId(try NewId.init(10));
53 try encoder.array(&.{ 1, 2, 3, 4, 5 });
54 try encoder.descriptorBorrowed(descriptor);
55 const encoded = try encoder.finish(&metadata);
56
57 var decoder = try Decoder.init(encoded.metadata, encoded.payload, encoded.descriptors);
58 try std.testing.expectEqual(@as(i32, -17), try decoder.signed());
59 try std.testing.expectEqual(@as(u32, 42), try decoder.unsigned());
60 try std.testing.expectEqual(@as(i32, -129), (try decoder.fixed()).raw);
61 try std.testing.expectEqualStrings("hello", try decoder.string());
62 try std.testing.expect((try decoder.optionalString()) == null);
63 try std.testing.expectEqual(@as(u32, 9), (try decoder.object()).raw);
64 try std.testing.expect((try decoder.optionalObject()) == null);
65 try std.testing.expectEqual(@as(u32, 10), (try decoder.newId()).raw);
66 try std.testing.expectEqualSlices(u8, &.{ 1, 2, 3, 4, 5 }, try decoder.array());
67 try std.testing.expectEqual(descriptor, try decoder.descriptor());
68 try decoder.finish();
69 }