annotate win32-mingw/include/capnp/test.capnp @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 37d53a7e8262
children
rev   line source
Chris@50 1 # Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
Chris@50 2 # Licensed under the MIT License:
Chris@50 3 #
Chris@50 4 # Permission is hereby granted, free of charge, to any person obtaining a copy
Chris@50 5 # of this software and associated documentation files (the "Software"), to deal
Chris@50 6 # in the Software without restriction, including without limitation the rights
Chris@50 7 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Chris@50 8 # copies of the Software, and to permit persons to whom the Software is
Chris@50 9 # furnished to do so, subject to the following conditions:
Chris@50 10 #
Chris@50 11 # The above copyright notice and this permission notice shall be included in
Chris@50 12 # all copies or substantial portions of the Software.
Chris@50 13 #
Chris@50 14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Chris@50 15 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Chris@50 16 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Chris@50 17 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Chris@50 18 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Chris@50 19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Chris@50 20 # THE SOFTWARE.
Chris@50 21
Chris@50 22 @0xd508eebdc2dc42b8;
Chris@50 23
Chris@50 24 using Cxx = import "c++.capnp";
Chris@50 25
Chris@50 26 # Use a namespace likely to cause trouble if the generated code doesn't use fully-qualified
Chris@50 27 # names for stuff in the capnproto namespace.
Chris@50 28 $Cxx.namespace("capnproto_test::capnp::test");
Chris@50 29
Chris@50 30 enum TestEnum {
Chris@50 31 foo @0;
Chris@50 32 bar @1;
Chris@50 33 baz @2;
Chris@50 34 qux @3;
Chris@50 35 quux @4;
Chris@50 36 corge @5;
Chris@50 37 grault @6;
Chris@50 38 garply @7;
Chris@50 39 }
Chris@50 40
Chris@50 41 struct TestAllTypes {
Chris@50 42 voidField @0 : Void;
Chris@50 43 boolField @1 : Bool;
Chris@50 44 int8Field @2 : Int8;
Chris@50 45 int16Field @3 : Int16;
Chris@50 46 int32Field @4 : Int32;
Chris@50 47 int64Field @5 : Int64;
Chris@50 48 uInt8Field @6 : UInt8;
Chris@50 49 uInt16Field @7 : UInt16;
Chris@50 50 uInt32Field @8 : UInt32;
Chris@50 51 uInt64Field @9 : UInt64;
Chris@50 52 float32Field @10 : Float32;
Chris@50 53 float64Field @11 : Float64;
Chris@50 54 textField @12 : Text;
Chris@50 55 dataField @13 : Data;
Chris@50 56 structField @14 : TestAllTypes;
Chris@50 57 enumField @15 : TestEnum;
Chris@50 58 interfaceField @16 : Void; # TODO
Chris@50 59
Chris@50 60 voidList @17 : List(Void);
Chris@50 61 boolList @18 : List(Bool);
Chris@50 62 int8List @19 : List(Int8);
Chris@50 63 int16List @20 : List(Int16);
Chris@50 64 int32List @21 : List(Int32);
Chris@50 65 int64List @22 : List(Int64);
Chris@50 66 uInt8List @23 : List(UInt8);
Chris@50 67 uInt16List @24 : List(UInt16);
Chris@50 68 uInt32List @25 : List(UInt32);
Chris@50 69 uInt64List @26 : List(UInt64);
Chris@50 70 float32List @27 : List(Float32);
Chris@50 71 float64List @28 : List(Float64);
Chris@50 72 textList @29 : List(Text);
Chris@50 73 dataList @30 : List(Data);
Chris@50 74 structList @31 : List(TestAllTypes);
Chris@50 75 enumList @32 : List(TestEnum);
Chris@50 76 interfaceList @33 : List(Void); # TODO
Chris@50 77 }
Chris@50 78
Chris@50 79 struct TestDefaults {
Chris@50 80 voidField @0 : Void = void;
Chris@50 81 boolField @1 : Bool = true;
Chris@50 82 int8Field @2 : Int8 = -123;
Chris@50 83 int16Field @3 : Int16 = -12345;
Chris@50 84 int32Field @4 : Int32 = -12345678;
Chris@50 85 int64Field @5 : Int64 = -123456789012345;
Chris@50 86 uInt8Field @6 : UInt8 = 234;
Chris@50 87 uInt16Field @7 : UInt16 = 45678;
Chris@50 88 uInt32Field @8 : UInt32 = 3456789012;
Chris@50 89 uInt64Field @9 : UInt64 = 12345678901234567890;
Chris@50 90 float32Field @10 : Float32 = 1234.5;
Chris@50 91 float64Field @11 : Float64 = -123e45;
Chris@50 92 textField @12 : Text = "foo";
Chris@50 93 dataField @13 : Data = 0x"62 61 72"; # "bar"
Chris@50 94 structField @14 : TestAllTypes = (
Chris@50 95 voidField = void,
Chris@50 96 boolField = true,
Chris@50 97 int8Field = -12,
Chris@50 98 int16Field = 3456,
Chris@50 99 int32Field = -78901234,
Chris@50 100 int64Field = 56789012345678,
Chris@50 101 uInt8Field = 90,
Chris@50 102 uInt16Field = 1234,
Chris@50 103 uInt32Field = 56789012,
Chris@50 104 uInt64Field = 345678901234567890,
Chris@50 105 float32Field = -1.25e-10,
Chris@50 106 float64Field = 345,
Chris@50 107 textField = "baz",
Chris@50 108 dataField = "qux",
Chris@50 109 structField = (
Chris@50 110 textField = "nested",
Chris@50 111 structField = (textField = "really nested")),
Chris@50 112 enumField = baz,
Chris@50 113 # interfaceField can't have a default
Chris@50 114
Chris@50 115 voidList = [void, void, void],
Chris@50 116 boolList = [false, true, false, true, true],
Chris@50 117 int8List = [12, -34, -0x80, 0x7f],
Chris@50 118 int16List = [1234, -5678, -0x8000, 0x7fff],
Chris@50 119 int32List = [12345678, -90123456, -0x80000000, 0x7fffffff],
Chris@50 120 int64List = [123456789012345, -678901234567890, -0x8000000000000000, 0x7fffffffffffffff],
Chris@50 121 uInt8List = [12, 34, 0, 0xff],
Chris@50 122 uInt16List = [1234, 5678, 0, 0xffff],
Chris@50 123 uInt32List = [12345678, 90123456, 0, 0xffffffff],
Chris@50 124 uInt64List = [123456789012345, 678901234567890, 0, 0xffffffffffffffff],
Chris@50 125 float32List = [0, 1234567, 1e37, -1e37, 1e-37, -1e-37],
Chris@50 126 float64List = [0, 123456789012345, 1e306, -1e306, 1e-306, -1e-306],
Chris@50 127 textList = ["quux", "corge", "grault"],
Chris@50 128 dataList = ["garply", "waldo", "fred"],
Chris@50 129 structList = [
Chris@50 130 (textField = "x structlist 1"),
Chris@50 131 (textField = "x structlist 2"),
Chris@50 132 (textField = "x structlist 3")],
Chris@50 133 enumList = [qux, bar, grault]
Chris@50 134 # interfaceList can't have a default
Chris@50 135 );
Chris@50 136 enumField @15 : TestEnum = corge;
Chris@50 137 interfaceField @16 : Void; # TODO
Chris@50 138
Chris@50 139 voidList @17 : List(Void) = [void, void, void, void, void, void];
Chris@50 140 boolList @18 : List(Bool) = [true, false, false, true];
Chris@50 141 int8List @19 : List(Int8) = [111, -111];
Chris@50 142 int16List @20 : List(Int16) = [11111, -11111];
Chris@50 143 int32List @21 : List(Int32) = [111111111, -111111111];
Chris@50 144 int64List @22 : List(Int64) = [1111111111111111111, -1111111111111111111];
Chris@50 145 uInt8List @23 : List(UInt8) = [111, 222] ;
Chris@50 146 uInt16List @24 : List(UInt16) = [33333, 44444];
Chris@50 147 uInt32List @25 : List(UInt32) = [3333333333];
Chris@50 148 uInt64List @26 : List(UInt64) = [11111111111111111111];
Chris@50 149 float32List @27 : List(Float32) = [5555.5, inf, -inf, nan];
Chris@50 150 float64List @28 : List(Float64) = [7777.75, inf, -inf, nan];
Chris@50 151 textList @29 : List(Text) = ["plugh", "xyzzy", "thud"];
Chris@50 152 dataList @30 : List(Data) = ["oops", "exhausted", "rfc3092"];
Chris@50 153 structList @31 : List(TestAllTypes) = [
Chris@50 154 (textField = "structlist 1"),
Chris@50 155 (textField = "structlist 2"),
Chris@50 156 (textField = "structlist 3")];
Chris@50 157 enumList @32 : List(TestEnum) = [foo, garply];
Chris@50 158 interfaceList @33 : List(Void); # TODO
Chris@50 159 }
Chris@50 160
Chris@50 161 struct TestAnyPointer {
Chris@50 162 anyPointerField @0 :AnyPointer;
Chris@50 163
Chris@50 164 # Do not add any other fields here! Some tests rely on anyPointerField being the last pointer
Chris@50 165 # in the struct.
Chris@50 166 }
Chris@50 167
Chris@50 168 struct TestAnyOthers {
Chris@50 169 anyStructField @0 :AnyStruct;
Chris@50 170 anyListField @1 :AnyList;
Chris@50 171 capabilityField @2 :Capability;
Chris@50 172 }
Chris@50 173
Chris@50 174 struct TestOutOfOrder {
Chris@50 175 foo @3 :Text;
Chris@50 176 bar @2 :Text;
Chris@50 177 baz @8 :Text;
Chris@50 178 qux @0 :Text;
Chris@50 179 quux @6 :Text;
Chris@50 180 corge @4 :Text;
Chris@50 181 grault @1 :Text;
Chris@50 182 garply @7 :Text;
Chris@50 183 waldo @5 :Text;
Chris@50 184 }
Chris@50 185
Chris@50 186 struct TestUnion {
Chris@50 187 union0 @0! :union {
Chris@50 188 # Pack union 0 under ideal conditions: there is no unused padding space prior to it.
Chris@50 189 u0f0s0 @4: Void;
Chris@50 190 u0f0s1 @5: Bool;
Chris@50 191 u0f0s8 @6: Int8;
Chris@50 192 u0f0s16 @7: Int16;
Chris@50 193 u0f0s32 @8: Int32;
Chris@50 194 u0f0s64 @9: Int64;
Chris@50 195 u0f0sp @10: Text;
Chris@50 196
Chris@50 197 # Pack more stuff into union0 -- should go in same space.
Chris@50 198 u0f1s0 @11: Void;
Chris@50 199 u0f1s1 @12: Bool;
Chris@50 200 u0f1s8 @13: Int8;
Chris@50 201 u0f1s16 @14: Int16;
Chris@50 202 u0f1s32 @15: Int32;
Chris@50 203 u0f1s64 @16: Int64;
Chris@50 204 u0f1sp @17: Text;
Chris@50 205 }
Chris@50 206
Chris@50 207 # Pack one bit in order to make pathological situation for union1.
Chris@50 208 bit0 @18: Bool;
Chris@50 209
Chris@50 210 union1 @1! :union {
Chris@50 211 # Pack pathologically bad case. Each field takes up new space.
Chris@50 212 u1f0s0 @19: Void;
Chris@50 213 u1f0s1 @20: Bool;
Chris@50 214 u1f1s1 @21: Bool;
Chris@50 215 u1f0s8 @22: Int8;
Chris@50 216 u1f1s8 @23: Int8;
Chris@50 217 u1f0s16 @24: Int16;
Chris@50 218 u1f1s16 @25: Int16;
Chris@50 219 u1f0s32 @26: Int32;
Chris@50 220 u1f1s32 @27: Int32;
Chris@50 221 u1f0s64 @28: Int64;
Chris@50 222 u1f1s64 @29: Int64;
Chris@50 223 u1f0sp @30: Text;
Chris@50 224 u1f1sp @31: Text;
Chris@50 225
Chris@50 226 # Pack more stuff into union1 -- each should go into the same space as corresponding u1f0s*.
Chris@50 227 u1f2s0 @32: Void;
Chris@50 228 u1f2s1 @33: Bool;
Chris@50 229 u1f2s8 @34: Int8;
Chris@50 230 u1f2s16 @35: Int16;
Chris@50 231 u1f2s32 @36: Int32;
Chris@50 232 u1f2s64 @37: Int64;
Chris@50 233 u1f2sp @38: Text;
Chris@50 234 }
Chris@50 235
Chris@50 236 # Fill in the rest of that bitfield from earlier.
Chris@50 237 bit2 @39: Bool;
Chris@50 238 bit3 @40: Bool;
Chris@50 239 bit4 @41: Bool;
Chris@50 240 bit5 @42: Bool;
Chris@50 241 bit6 @43: Bool;
Chris@50 242 bit7 @44: Bool;
Chris@50 243
Chris@50 244 # Interleave two unions to be really annoying.
Chris@50 245 # Also declare in reverse order to make sure union discriminant values are sorted by field number
Chris@50 246 # and not by declaration order.
Chris@50 247 union2 @2! :union {
Chris@50 248 u2f0s64 @54: Int64;
Chris@50 249 u2f0s32 @52: Int32;
Chris@50 250 u2f0s16 @50: Int16;
Chris@50 251 u2f0s8 @47: Int8;
Chris@50 252 u2f0s1 @45: Bool;
Chris@50 253 }
Chris@50 254
Chris@50 255 union3 @3! :union {
Chris@50 256 u3f0s64 @55: Int64;
Chris@50 257 u3f0s32 @53: Int32;
Chris@50 258 u3f0s16 @51: Int16;
Chris@50 259 u3f0s8 @48: Int8;
Chris@50 260 u3f0s1 @46: Bool;
Chris@50 261 }
Chris@50 262
Chris@50 263 byte0 @49: UInt8;
Chris@50 264 }
Chris@50 265
Chris@50 266 struct TestUnnamedUnion {
Chris@50 267 before @0 :Text;
Chris@50 268
Chris@50 269 union {
Chris@50 270 foo @1 :UInt16;
Chris@50 271 bar @3 :UInt32;
Chris@50 272 }
Chris@50 273
Chris@50 274 middle @2 :UInt16;
Chris@50 275
Chris@50 276 after @4 :Text;
Chris@50 277 }
Chris@50 278
Chris@50 279 struct TestUnionInUnion {
Chris@50 280 # There is no reason to ever do this.
Chris@50 281 outer :union {
Chris@50 282 inner :union {
Chris@50 283 foo @0 :Int32;
Chris@50 284 bar @1 :Int32;
Chris@50 285 }
Chris@50 286 baz @2 :Int32;
Chris@50 287 }
Chris@50 288 }
Chris@50 289
Chris@50 290 struct TestGroups {
Chris@50 291 groups :union {
Chris@50 292 foo :group {
Chris@50 293 corge @0 :Int32;
Chris@50 294 grault @2 :Int64;
Chris@50 295 garply @8 :Text;
Chris@50 296 }
Chris@50 297 bar :group {
Chris@50 298 corge @3 :Int32;
Chris@50 299 grault @4 :Text;
Chris@50 300 garply @5 :Int64;
Chris@50 301 }
Chris@50 302 baz :group {
Chris@50 303 corge @1 :Int32;
Chris@50 304 grault @6 :Text;
Chris@50 305 garply @7 :Text;
Chris@50 306 }
Chris@50 307 }
Chris@50 308 }
Chris@50 309
Chris@50 310 struct TestInterleavedGroups {
Chris@50 311 group1 :group {
Chris@50 312 foo @0 :UInt32;
Chris@50 313 bar @2 :UInt64;
Chris@50 314 union {
Chris@50 315 qux @4 :UInt16;
Chris@50 316 corge :group {
Chris@50 317 grault @6 :UInt64;
Chris@50 318 garply @8 :UInt16;
Chris@50 319 plugh @14 :Text;
Chris@50 320 xyzzy @16 :Text;
Chris@50 321 }
Chris@50 322
Chris@50 323 fred @12 :Text;
Chris@50 324 }
Chris@50 325
Chris@50 326 waldo @10 :Text;
Chris@50 327 }
Chris@50 328
Chris@50 329 group2 :group {
Chris@50 330 foo @1 :UInt32;
Chris@50 331 bar @3 :UInt64;
Chris@50 332 union {
Chris@50 333 qux @5 :UInt16;
Chris@50 334 corge :group {
Chris@50 335 grault @7 :UInt64;
Chris@50 336 garply @9 :UInt16;
Chris@50 337 plugh @15 :Text;
Chris@50 338 xyzzy @17 :Text;
Chris@50 339 }
Chris@50 340
Chris@50 341 fred @13 :Text;
Chris@50 342 }
Chris@50 343
Chris@50 344 waldo @11 :Text;
Chris@50 345 }
Chris@50 346 }
Chris@50 347
Chris@50 348 struct TestUnionDefaults {
Chris@50 349 s16s8s64s8Set @0 :TestUnion =
Chris@50 350 (union0 = (u0f0s16 = 321), union1 = (u1f0s8 = 123), union2 = (u2f0s64 = 12345678901234567),
Chris@50 351 union3 = (u3f0s8 = 55));
Chris@50 352 s0sps1s32Set @1 :TestUnion =
Chris@50 353 (union0 = (u0f1s0 = void), union1 = (u1f0sp = "foo"), union2 = (u2f0s1 = true),
Chris@50 354 union3 = (u3f0s32 = 12345678));
Chris@50 355
Chris@50 356 unnamed1 @2 :TestUnnamedUnion = (foo = 123);
Chris@50 357 unnamed2 @3 :TestUnnamedUnion = (bar = 321, before = "foo", after = "bar");
Chris@50 358 }
Chris@50 359
Chris@50 360 struct TestNestedTypes {
Chris@50 361 enum NestedEnum {
Chris@50 362 foo @0;
Chris@50 363 bar @1;
Chris@50 364 }
Chris@50 365
Chris@50 366 struct NestedStruct {
Chris@50 367 enum NestedEnum {
Chris@50 368 baz @0;
Chris@50 369 qux @1;
Chris@50 370 quux @2;
Chris@50 371 }
Chris@50 372
Chris@50 373 outerNestedEnum @0 :TestNestedTypes.NestedEnum = bar;
Chris@50 374 innerNestedEnum @1 :NestedEnum = quux;
Chris@50 375 }
Chris@50 376
Chris@50 377 nestedStruct @0 :NestedStruct;
Chris@50 378
Chris@50 379 outerNestedEnum @1 :NestedEnum = bar;
Chris@50 380 innerNestedEnum @2 :NestedStruct.NestedEnum = quux;
Chris@50 381 }
Chris@50 382
Chris@50 383 struct TestUsing {
Chris@50 384 using OuterNestedEnum = TestNestedTypes.NestedEnum;
Chris@50 385 using TestNestedTypes.NestedStruct.NestedEnum;
Chris@50 386
Chris@50 387 outerNestedEnum @1 :OuterNestedEnum = bar;
Chris@50 388 innerNestedEnum @0 :NestedEnum = quux;
Chris@50 389 }
Chris@50 390
Chris@50 391 struct TestLists {
Chris@50 392 # Small structs, when encoded as list, will be encoded as primitive lists rather than struct
Chris@50 393 # lists, to save space.
Chris@50 394 struct Struct0 { f @0 :Void; }
Chris@50 395 struct Struct1 { f @0 :Bool; }
Chris@50 396 struct Struct8 { f @0 :UInt8; }
Chris@50 397 struct Struct16 { f @0 :UInt16; }
Chris@50 398 struct Struct32 { f @0 :UInt32; }
Chris@50 399 struct Struct64 { f @0 :UInt64; }
Chris@50 400 struct StructP { f @0 :Text; }
Chris@50 401
Chris@50 402 # Versions of the above which cannot be encoded as primitive lists.
Chris@50 403 struct Struct0c { f @0 :Void; pad @1 :Text; }
Chris@50 404 struct Struct1c { f @0 :Bool; pad @1 :Text; }
Chris@50 405 struct Struct8c { f @0 :UInt8; pad @1 :Text; }
Chris@50 406 struct Struct16c { f @0 :UInt16; pad @1 :Text; }
Chris@50 407 struct Struct32c { f @0 :UInt32; pad @1 :Text; }
Chris@50 408 struct Struct64c { f @0 :UInt64; pad @1 :Text; }
Chris@50 409 struct StructPc { f @0 :Text; pad @1 :UInt64; }
Chris@50 410
Chris@50 411 list0 @0 :List(Struct0);
Chris@50 412 list1 @1 :List(Struct1);
Chris@50 413 list8 @2 :List(Struct8);
Chris@50 414 list16 @3 :List(Struct16);
Chris@50 415 list32 @4 :List(Struct32);
Chris@50 416 list64 @5 :List(Struct64);
Chris@50 417 listP @6 :List(StructP);
Chris@50 418
Chris@50 419 int32ListList @7 :List(List(Int32));
Chris@50 420 textListList @8 :List(List(Text));
Chris@50 421 structListList @9 :List(List(TestAllTypes));
Chris@50 422 }
Chris@50 423
Chris@50 424 struct TestFieldZeroIsBit {
Chris@50 425 bit @0 :Bool;
Chris@50 426 secondBit @1 :Bool = true;
Chris@50 427 thirdField @2 :UInt8 = 123;
Chris@50 428 }
Chris@50 429
Chris@50 430 struct TestListDefaults {
Chris@50 431 lists @0 :TestLists = (
Chris@50 432 list0 = [(f = void), (f = void)],
Chris@50 433 list1 = [(f = true), (f = false), (f = true), (f = true)],
Chris@50 434 list8 = [(f = 123), (f = 45)],
Chris@50 435 list16 = [(f = 12345), (f = 6789)],
Chris@50 436 list32 = [(f = 123456789), (f = 234567890)],
Chris@50 437 list64 = [(f = 1234567890123456), (f = 2345678901234567)],
Chris@50 438 listP = [(f = "foo"), (f = "bar")],
Chris@50 439 int32ListList = [[1, 2, 3], [4, 5], [12341234]],
Chris@50 440 textListList = [["foo", "bar"], ["baz"], ["qux", "corge"]],
Chris@50 441 structListList = [[(int32Field = 123), (int32Field = 456)], [(int32Field = 789)]]);
Chris@50 442 }
Chris@50 443
Chris@50 444 struct TestLateUnion {
Chris@50 445 # Test what happens if the unions are not the first ordinals in the struct. At one point this
Chris@50 446 # was broken for the dynamic API.
Chris@50 447
Chris@50 448 foo @0 :Int32;
Chris@50 449 bar @1 :Text;
Chris@50 450 baz @2 :Int16;
Chris@50 451
Chris@50 452 theUnion @3! :union {
Chris@50 453 qux @4 :Text;
Chris@50 454 corge @5 :List(Int32);
Chris@50 455 grault @6 :Float32;
Chris@50 456 }
Chris@50 457
Chris@50 458 anotherUnion @7! :union {
Chris@50 459 qux @8 :Text;
Chris@50 460 corge @9 :List(Int32);
Chris@50 461 grault @10 :Float32;
Chris@50 462 }
Chris@50 463 }
Chris@50 464
Chris@50 465 struct TestOldVersion {
Chris@50 466 # A subset of TestNewVersion.
Chris@50 467 old1 @0 :Int64;
Chris@50 468 old2 @1 :Text;
Chris@50 469 old3 @2 :TestOldVersion;
Chris@50 470 }
Chris@50 471
Chris@50 472 struct TestNewVersion {
Chris@50 473 # A superset of TestOldVersion.
Chris@50 474 old1 @0 :Int64;
Chris@50 475 old2 @1 :Text;
Chris@50 476 old3 @2 :TestNewVersion;
Chris@50 477 new1 @3 :Int64 = 987;
Chris@50 478 new2 @4 :Text = "baz";
Chris@50 479 }
Chris@50 480
Chris@50 481 struct TestOldUnionVersion {
Chris@50 482 union {
Chris@50 483 a @0 :Void;
Chris@50 484 b @1 :UInt64;
Chris@50 485 }
Chris@50 486 }
Chris@50 487
Chris@50 488 struct TestNewUnionVersion {
Chris@50 489 union {
Chris@50 490 a :union {
Chris@50 491 a0 @0 :Void;
Chris@50 492 a1 @2 :UInt64;
Chris@50 493 }
Chris@50 494 b @1 :UInt64;
Chris@50 495 }
Chris@50 496 }
Chris@50 497
Chris@50 498 struct TestStructUnion {
Chris@50 499 un @0! :union {
Chris@50 500 struct @1 :SomeStruct;
Chris@50 501 object @2 :TestAnyPointer;
Chris@50 502 }
Chris@50 503
Chris@50 504 struct SomeStruct {
Chris@50 505 someText @0 :Text;
Chris@50 506 moreText @1 :Text;
Chris@50 507 }
Chris@50 508 }
Chris@50 509
Chris@50 510 struct TestPrintInlineStructs {
Chris@50 511 someText @0 :Text;
Chris@50 512
Chris@50 513 structList @1 :List(InlineStruct);
Chris@50 514 struct InlineStruct {
Chris@50 515 int32Field @0 :Int32;
Chris@50 516 textField @1 :Text;
Chris@50 517 }
Chris@50 518 }
Chris@50 519
Chris@50 520 struct TestWholeFloatDefault {
Chris@50 521 # At one point, these failed to compile in C++ because it would produce literals like "123f",
Chris@50 522 # which is not valid; it needs to be "123.0f".
Chris@50 523 field @0 :Float32 = 123;
Chris@50 524 bigField @1 :Float32 = 2e30;
Chris@50 525 const constant :Float32 = 456;
Chris@50 526 const bigConstant :Float32 = 4e30;
Chris@50 527 }
Chris@50 528
Chris@50 529 struct TestGenerics(Foo, Bar) {
Chris@50 530 foo @0 :Foo;
Chris@50 531 rev @1 :TestGenerics(Bar, Foo);
Chris@50 532
Chris@50 533 union {
Chris@50 534 uv @2:Void;
Chris@50 535 ug :group {
Chris@50 536 ugfoo @3:Int32;
Chris@50 537 }
Chris@50 538 }
Chris@50 539
Chris@50 540 struct Inner {
Chris@50 541 foo @0 :Foo;
Chris@50 542 bar @1 :Bar;
Chris@50 543 }
Chris@50 544
Chris@50 545 struct Inner2(Baz) {
Chris@50 546 bar @0 :Bar;
Chris@50 547 baz @1 :Baz;
Chris@50 548 innerBound @2 :Inner;
Chris@50 549 innerUnbound @3 :TestGenerics.Inner;
Chris@50 550
Chris@50 551 struct DeepNest(Qux) {
Chris@50 552 foo @0 :Foo;
Chris@50 553 bar @1 :Bar;
Chris@50 554 baz @2 :Baz;
Chris@50 555 qux @3 :Qux;
Chris@50 556 }
Chris@50 557 }
Chris@50 558
Chris@50 559 interface Interface(Qux) {
Chris@50 560 call @0 Inner2(Text) -> (qux :Qux, gen :TestGenerics(TestAllTypes, TestAnyPointer));
Chris@50 561 }
Chris@50 562
Chris@50 563 annotation ann(struct) :Foo;
Chris@50 564
Chris@50 565 using AliasFoo = Foo;
Chris@50 566 using AliasInner = Inner;
Chris@50 567 using AliasInner2 = Inner2;
Chris@50 568 using AliasInner2Text = Inner2(Text);
Chris@50 569 using AliasRev = TestGenerics(Bar, Foo);
Chris@50 570
Chris@50 571 struct UseAliases {
Chris@50 572 foo @0 :AliasFoo;
Chris@50 573 inner @1 :AliasInner;
Chris@50 574 inner2 @2 :AliasInner2;
Chris@50 575 inner2Bind @3 :AliasInner2(Text);
Chris@50 576 inner2Text @4 :AliasInner2Text;
Chris@50 577 revFoo @5 :AliasRev.AliasFoo;
Chris@50 578 }
Chris@50 579 }
Chris@50 580
Chris@50 581 struct TestGenericsWrapper(Foo, Bar) {
Chris@50 582 value @0 :TestGenerics(Foo, Bar);
Chris@50 583 }
Chris@50 584
Chris@50 585 struct TestGenericsWrapper2 {
Chris@50 586 value @0 :TestGenericsWrapper(Text, TestAllTypes);
Chris@50 587 }
Chris@50 588
Chris@50 589 interface TestImplicitMethodParams {
Chris@50 590 call @0 [T, U] (foo :T, bar :U) -> TestGenerics(T, U);
Chris@50 591 }
Chris@50 592
Chris@50 593 interface TestImplicitMethodParamsInGeneric(V) {
Chris@50 594 call @0 [T, U] (foo :T, bar :U) -> TestGenerics(T, U);
Chris@50 595 }
Chris@50 596
Chris@50 597 struct TestGenericsUnion(Foo, Bar) {
Chris@50 598 # At one point this failed to compile.
Chris@50 599
Chris@50 600 union {
Chris@50 601 foo @0 :Foo;
Chris@50 602 bar @1 :Bar;
Chris@50 603 }
Chris@50 604 }
Chris@50 605
Chris@50 606 struct TestUseGenerics $TestGenerics(Text, Data).ann("foo") {
Chris@50 607 basic @0 :TestGenerics(TestAllTypes, TestAnyPointer);
Chris@50 608 inner @1 :TestGenerics(TestAllTypes, TestAnyPointer).Inner;
Chris@50 609 inner2 @2 :TestGenerics(TestAllTypes, TestAnyPointer).Inner2(Text);
Chris@50 610 unspecified @3 :TestGenerics;
Chris@50 611 unspecifiedInner @4 :TestGenerics.Inner2(Text);
Chris@50 612 wrapper @8 :TestGenericsWrapper(TestAllTypes, TestAnyPointer);
Chris@50 613 cap @18 :TestGenerics(TestInterface, Text);
Chris@50 614 genericCap @19 :TestGenerics(TestAllTypes, List(UInt32)).Interface(Data);
Chris@50 615
Chris@50 616 default @5 :TestGenerics(TestAllTypes, Text) =
Chris@50 617 (foo = (int16Field = 123), rev = (foo = "text", rev = (foo = (int16Field = 321))));
Chris@50 618 defaultInner @6 :TestGenerics(TestAllTypes, Text).Inner =
Chris@50 619 (foo = (int16Field = 123), bar = "text");
Chris@50 620 defaultUser @7 :TestUseGenerics = (basic = (foo = (int16Field = 123)));
Chris@50 621 defaultWrapper @9 :TestGenericsWrapper(Text, TestAllTypes) =
Chris@50 622 (value = (foo = "text", rev = (foo = (int16Field = 321))));
Chris@50 623 defaultWrapper2 @10 :TestGenericsWrapper2 =
Chris@50 624 (value = (value = (foo = "text", rev = (foo = (int16Field = 321)))));
Chris@50 625
Chris@50 626 aliasFoo @11 :TestGenerics(TestAllTypes, TestAnyPointer).AliasFoo = (int16Field = 123);
Chris@50 627 aliasInner @12 :TestGenerics(TestAllTypes, TestAnyPointer).AliasInner
Chris@50 628 = (foo = (int16Field = 123));
Chris@50 629 aliasInner2 @13 :TestGenerics(TestAllTypes, TestAnyPointer).AliasInner2
Chris@50 630 = (innerBound = (foo = (int16Field = 123)));
Chris@50 631 aliasInner2Bind @14 :TestGenerics(TestAllTypes, TestAnyPointer).AliasInner2(List(UInt32))
Chris@50 632 = (baz = [12, 34], innerBound = (foo = (int16Field = 123)));
Chris@50 633 aliasInner2Text @15 :TestGenerics(TestAllTypes, TestAnyPointer).AliasInner2Text
Chris@50 634 = (baz = "text", innerBound = (foo = (int16Field = 123)));
Chris@50 635 aliasRev @16 :TestGenerics(TestAnyPointer, Text).AliasRev.AliasFoo = "text";
Chris@50 636
Chris@50 637 useAliases @17 :TestGenerics(TestAllTypes, List(UInt32)).UseAliases = (
Chris@50 638 foo = (int16Field = 123),
Chris@50 639 inner = (foo = (int16Field = 123)),
Chris@50 640 inner2 = (innerBound = (foo = (int16Field = 123))),
Chris@50 641 inner2Bind = (baz = "text", innerBound = (foo = (int16Field = 123))),
Chris@50 642 inner2Text = (baz = "text", innerBound = (foo = (int16Field = 123))),
Chris@50 643 revFoo = [12, 34, 56]);
Chris@50 644 }
Chris@50 645
Chris@50 646 struct TestEmptyStruct {}
Chris@50 647
Chris@50 648 struct TestConstants {
Chris@50 649 const voidConst :Void = void;
Chris@50 650 const boolConst :Bool = true;
Chris@50 651 const int8Const :Int8 = -123;
Chris@50 652 const int16Const :Int16 = -12345;
Chris@50 653 const int32Const :Int32 = -12345678;
Chris@50 654 const int64Const :Int64 = -123456789012345;
Chris@50 655 const uint8Const :UInt8 = 234;
Chris@50 656 const uint16Const :UInt16 = 45678;
Chris@50 657 const uint32Const :UInt32 = 3456789012;
Chris@50 658 const uint64Const :UInt64 = 12345678901234567890;
Chris@50 659 const float32Const :Float32 = 1234.5;
Chris@50 660 const float64Const :Float64 = -123e45;
Chris@50 661 const textConst :Text = "foo";
Chris@50 662 const dataConst :Data = "bar";
Chris@50 663 const structConst :TestAllTypes = (
Chris@50 664 voidField = void,
Chris@50 665 boolField = true,
Chris@50 666 int8Field = -12,
Chris@50 667 int16Field = 3456,
Chris@50 668 int32Field = -78901234,
Chris@50 669 int64Field = 56789012345678,
Chris@50 670 uInt8Field = 90,
Chris@50 671 uInt16Field = 1234,
Chris@50 672 uInt32Field = 56789012,
Chris@50 673 uInt64Field = 345678901234567890,
Chris@50 674 float32Field = -1.25e-10,
Chris@50 675 float64Field = 345,
Chris@50 676 textField = "baz",
Chris@50 677 dataField = "qux",
Chris@50 678 structField = (
Chris@50 679 textField = "nested",
Chris@50 680 structField = (textField = "really nested")),
Chris@50 681 enumField = baz,
Chris@50 682 # interfaceField can't have a default
Chris@50 683
Chris@50 684 voidList = [void, void, void],
Chris@50 685 boolList = [false, true, false, true, true],
Chris@50 686 int8List = [12, -34, -0x80, 0x7f],
Chris@50 687 int16List = [1234, -5678, -0x8000, 0x7fff],
Chris@50 688 int32List = [12345678, -90123456, -0x80000000, 0x7fffffff],
Chris@50 689 int64List = [123456789012345, -678901234567890, -0x8000000000000000, 0x7fffffffffffffff],
Chris@50 690 uInt8List = [12, 34, 0, 0xff],
Chris@50 691 uInt16List = [1234, 5678, 0, 0xffff],
Chris@50 692 uInt32List = [12345678, 90123456, 0, 0xffffffff],
Chris@50 693 uInt64List = [123456789012345, 678901234567890, 0, 0xffffffffffffffff],
Chris@50 694 float32List = [0, 1234567, 1e37, -1e37, 1e-37, -1e-37],
Chris@50 695 float64List = [0, 123456789012345, 1e306, -1e306, 1e-306, -1e-306],
Chris@50 696 textList = ["quux", "corge", "grault"],
Chris@50 697 dataList = ["garply", "waldo", "fred"],
Chris@50 698 structList = [
Chris@50 699 (textField = "x structlist 1"),
Chris@50 700 (textField = "x structlist 2"),
Chris@50 701 (textField = "x structlist 3")],
Chris@50 702 enumList = [qux, bar, grault]
Chris@50 703 # interfaceList can't have a default
Chris@50 704 );
Chris@50 705 const enumConst :TestEnum = corge;
Chris@50 706
Chris@50 707 const voidListConst :List(Void) = [void, void, void, void, void, void];
Chris@50 708 const boolListConst :List(Bool) = [true, false, false, true];
Chris@50 709 const int8ListConst :List(Int8) = [111, -111];
Chris@50 710 const int16ListConst :List(Int16) = [11111, -11111];
Chris@50 711 const int32ListConst :List(Int32) = [111111111, -111111111];
Chris@50 712 const int64ListConst :List(Int64) = [1111111111111111111, -1111111111111111111];
Chris@50 713 const uint8ListConst :List(UInt8) = [111, 222] ;
Chris@50 714 const uint16ListConst :List(UInt16) = [33333, 44444];
Chris@50 715 const uint32ListConst :List(UInt32) = [3333333333];
Chris@50 716 const uint64ListConst :List(UInt64) = [11111111111111111111];
Chris@50 717 const float32ListConst :List(Float32) = [5555.5, inf, -inf, nan];
Chris@50 718 const float64ListConst :List(Float64) = [7777.75, inf, -inf, nan];
Chris@50 719 const textListConst :List(Text) = ["plugh", "xyzzy", "thud"];
Chris@50 720 const dataListConst :List(Data) = ["oops", "exhausted", "rfc3092"];
Chris@50 721 const structListConst :List(TestAllTypes) = [
Chris@50 722 (textField = "structlist 1"),
Chris@50 723 (textField = "structlist 2"),
Chris@50 724 (textField = "structlist 3")];
Chris@50 725 const enumListConst :List(TestEnum) = [foo, garply];
Chris@50 726 }
Chris@50 727
Chris@50 728 const globalInt :UInt32 = 12345;
Chris@50 729 const globalText :Text = "foobar";
Chris@50 730 const globalStruct :TestAllTypes = (int32Field = 54321);
Chris@50 731 const globalPrintableStruct :TestPrintInlineStructs = (someText = "foo");
Chris@50 732 const derivedConstant :TestAllTypes = (
Chris@50 733 uInt32Field = .globalInt,
Chris@50 734 textField = TestConstants.textConst,
Chris@50 735 structField = TestConstants.structConst,
Chris@50 736 int16List = TestConstants.int16ListConst,
Chris@50 737 structList = TestConstants.structListConst);
Chris@50 738
Chris@50 739 const genericConstant :TestGenerics(TestAllTypes, Text) =
Chris@50 740 (foo = (int16Field = 123), rev = (foo = "text", rev = (foo = (int16Field = 321))));
Chris@50 741
Chris@50 742 const embeddedData :Data = embed "testdata/packed";
Chris@50 743 const embeddedText :Text = embed "testdata/short.txt";
Chris@50 744 const embeddedStruct :TestAllTypes = embed "testdata/binary";
Chris@50 745
Chris@50 746 interface TestInterface {
Chris@50 747 foo @0 (i :UInt32, j :Bool) -> (x :Text);
Chris@50 748 bar @1 () -> ();
Chris@50 749 baz @2 (s: TestAllTypes);
Chris@50 750 }
Chris@50 751
Chris@50 752 interface TestExtends extends(TestInterface) {
Chris@50 753 qux @0 ();
Chris@50 754 corge @1 TestAllTypes -> ();
Chris@50 755 grault @2 () -> TestAllTypes;
Chris@50 756 }
Chris@50 757
Chris@50 758 interface TestExtends2 extends(TestExtends) {}
Chris@50 759
Chris@50 760 interface TestPipeline {
Chris@50 761 getCap @0 (n: UInt32, inCap :TestInterface) -> (s: Text, outBox :Box);
Chris@50 762 testPointers @1 (cap :TestInterface, obj :AnyPointer, list :List(TestInterface)) -> ();
Chris@50 763
Chris@50 764 struct Box {
Chris@50 765 cap @0 :TestInterface;
Chris@50 766 }
Chris@50 767 }
Chris@50 768
Chris@50 769 interface TestCallOrder {
Chris@50 770 getCallSequence @0 (expected: UInt32) -> (n: UInt32);
Chris@50 771 # First call returns 0, next returns 1, ...
Chris@50 772 #
Chris@50 773 # The input `expected` is ignored but useful for disambiguating debug logs.
Chris@50 774 }
Chris@50 775
Chris@50 776 interface TestTailCallee {
Chris@50 777 struct TailResult {
Chris@50 778 i @0 :UInt32;
Chris@50 779 t @1 :Text;
Chris@50 780 c @2 :TestCallOrder;
Chris@50 781 }
Chris@50 782
Chris@50 783 foo @0 (i :Int32, t :Text) -> TailResult;
Chris@50 784 }
Chris@50 785
Chris@50 786 interface TestTailCaller {
Chris@50 787 foo @0 (i :Int32, callee :TestTailCallee) -> TestTailCallee.TailResult;
Chris@50 788 }
Chris@50 789
Chris@50 790 interface TestHandle {}
Chris@50 791
Chris@50 792 interface TestMoreStuff extends(TestCallOrder) {
Chris@50 793 # Catch-all type that contains lots of testing methods.
Chris@50 794
Chris@50 795 callFoo @0 (cap :TestInterface) -> (s: Text);
Chris@50 796 # Call `cap.foo()`, check the result, and return "bar".
Chris@50 797
Chris@50 798 callFooWhenResolved @1 (cap :TestInterface) -> (s: Text);
Chris@50 799 # Like callFoo but waits for `cap` to resolve first.
Chris@50 800
Chris@50 801 neverReturn @2 (cap :TestInterface) -> (capCopy :TestInterface);
Chris@50 802 # Doesn't return. You should cancel it.
Chris@50 803
Chris@50 804 hold @3 (cap :TestInterface) -> ();
Chris@50 805 # Returns immediately but holds on to the capability.
Chris@50 806
Chris@50 807 callHeld @4 () -> (s: Text);
Chris@50 808 # Calls the capability previously held using `hold` (and keeps holding it).
Chris@50 809
Chris@50 810 getHeld @5 () -> (cap :TestInterface);
Chris@50 811 # Returns the capability previously held using `hold` (and keeps holding it).
Chris@50 812
Chris@50 813 echo @6 (cap :TestCallOrder) -> (cap :TestCallOrder);
Chris@50 814 # Just returns the input cap.
Chris@50 815
Chris@50 816 expectCancel @7 (cap :TestInterface) -> ();
Chris@50 817 # evalLater()-loops forever, holding `cap`. Must be canceled.
Chris@50 818
Chris@50 819 methodWithDefaults @8 (a :Text, b :UInt32 = 123, c :Text = "foo") -> (d :Text, e :Text = "bar");
Chris@50 820
Chris@50 821 getHandle @9 () -> (handle :TestHandle);
Chris@50 822 # Get a new handle. Tests have an out-of-band way to check the current number of live handles, so
Chris@50 823 # this can be used to test garbage collection.
Chris@50 824
Chris@50 825 getNull @10 () -> (nullCap :TestMoreStuff);
Chris@50 826 # Always returns a null capability.
Chris@50 827 }
Chris@50 828
Chris@50 829 interface TestMembrane {
Chris@50 830 makeThing @0 () -> (thing :Thing);
Chris@50 831 callPassThrough @1 (thing :Thing, tailCall :Bool) -> Result;
Chris@50 832 callIntercept @2 (thing :Thing, tailCall :Bool) -> Result;
Chris@50 833 loopback @3 (thing :Thing) -> (thing :Thing);
Chris@50 834
Chris@50 835 interface Thing {
Chris@50 836 passThrough @0 () -> Result;
Chris@50 837 intercept @1 () -> Result;
Chris@50 838 }
Chris@50 839
Chris@50 840 struct Result {
Chris@50 841 text @0 :Text;
Chris@50 842 }
Chris@50 843 }
Chris@50 844
Chris@50 845 struct TestContainMembrane {
Chris@50 846 cap @0 :TestMembrane.Thing;
Chris@50 847 list @1 :List(TestMembrane.Thing);
Chris@50 848 }
Chris@50 849
Chris@50 850 struct TestTransferCap {
Chris@50 851 list @0 :List(Element);
Chris@50 852 struct Element {
Chris@50 853 text @0 :Text;
Chris@50 854 cap @1 :TestInterface;
Chris@50 855 }
Chris@50 856 }
Chris@50 857
Chris@50 858 interface TestKeywordMethods {
Chris@50 859 delete @0 ();
Chris@50 860 class @1 ();
Chris@50 861 void @2 ();
Chris@50 862 return @3 ();
Chris@50 863 }
Chris@50 864
Chris@50 865 interface TestAuthenticatedBootstrap(VatId) {
Chris@50 866 getCallerId @0 () -> (caller :VatId);
Chris@50 867 }
Chris@50 868
Chris@50 869 struct TestSturdyRef {
Chris@50 870 hostId @0 :TestSturdyRefHostId;
Chris@50 871 objectId @1 :AnyPointer;
Chris@50 872 }
Chris@50 873
Chris@50 874 struct TestSturdyRefHostId {
Chris@50 875 host @0 :Text;
Chris@50 876 }
Chris@50 877
Chris@50 878 struct TestSturdyRefObjectId {
Chris@50 879 tag @0 :Tag;
Chris@50 880 enum Tag {
Chris@50 881 testInterface @0;
Chris@50 882 testExtends @1;
Chris@50 883 testPipeline @2;
Chris@50 884 testTailCallee @3;
Chris@50 885 testTailCaller @4;
Chris@50 886 testMoreStuff @5;
Chris@50 887 }
Chris@50 888 }
Chris@50 889
Chris@50 890 struct TestProvisionId {}
Chris@50 891 struct TestRecipientId {}
Chris@50 892 struct TestThirdPartyCapId {}
Chris@50 893 struct TestJoinResult {}
Chris@50 894
Chris@50 895 struct TestNameAnnotation $Cxx.name("RenamedStruct") {
Chris@50 896 union {
Chris@50 897 badFieldName @0 :Bool $Cxx.name("goodFieldName");
Chris@50 898 bar @1 :Int8;
Chris@50 899 }
Chris@50 900
Chris@50 901 enum BadlyNamedEnum $Cxx.name("RenamedEnum") {
Chris@50 902 foo @0;
Chris@50 903 bar @1;
Chris@50 904 baz @2 $Cxx.name("qux");
Chris@50 905 }
Chris@50 906
Chris@50 907 anotherBadFieldName @2 :BadlyNamedEnum $Cxx.name("anotherGoodFieldName");
Chris@50 908
Chris@50 909 struct NestedStruct $Cxx.name("RenamedNestedStruct") {
Chris@50 910 badNestedFieldName @0 :Bool $Cxx.name("goodNestedFieldName");
Chris@50 911 anotherBadNestedFieldName @1 :NestedStruct $Cxx.name("anotherGoodNestedFieldName");
Chris@50 912
Chris@50 913 enum DeeplyNestedEnum $Cxx.name("RenamedDeeplyNestedEnum") {
Chris@50 914 quux @0;
Chris@50 915 corge @1;
Chris@50 916 grault @2 $Cxx.name("garply");
Chris@50 917 }
Chris@50 918 }
Chris@50 919
Chris@50 920 badlyNamedUnion :union $Cxx.name("renamedUnion") {
Chris@50 921 badlyNamedGroup :group $Cxx.name("renamedGroup") {
Chris@50 922 foo @3 :Void;
Chris@50 923 bar @4 :Void;
Chris@50 924 }
Chris@50 925 baz @5 :NestedStruct $Cxx.name("qux");
Chris@50 926 }
Chris@50 927 }
Chris@50 928
Chris@50 929 interface TestNameAnnotationInterface $Cxx.name("RenamedInterface") {
Chris@50 930 badlyNamedMethod @0 (badlyNamedParam :UInt8 $Cxx.name("renamedParam")) $Cxx.name("renamedMethod");
Chris@50 931 }