blob: bd7b169350258597a2a3f2ffb25ec5da48268aa4 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package summarize
import (
"io"
"strings"
"testing"
"github.com/google/go-cmp/cmp"
"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgentest"
)
var (
// zxLibrary is a shortened version of zx_common.fidl, for tests.
zxLibrary = `
library zx;
enum obj_type : uint32 {
CHANNEL = 4;
};
resource_definition handle : uint32 {
properties {
obj_type subtype;
};
};
`
// l2Library is a sample dependency taken in by some tests.
l2Library = `library l2; struct T{};`
)
type summaryTestCase struct {
name string
fidl string
dep string
expected string
}
func TestWrite(t *testing.T) {
tests := []summaryTestCase{
{
name: "library only",
fidl: `library l;`,
expected: `library l
`,
},
{
name: "primitives 1",
fidl: `
library l;
const int8 OFFSET = -33;
const bool ENABLED_FLAG = true;
`,
expected: `const l/ENABLED_FLAG bool
const l/OFFSET int8
library l
`,
},
{
// Same as above, except reordered.
name: "primitives 2",
fidl: `
library l;
const bool ENABLED_FLAG = true;
const int8 OFFSET = -33;
`,
expected: `const l/ENABLED_FLAG bool
const l/OFFSET int8
library l
`,
},
{
name: "primitives 3",
fidl: `
library l;
const uint16 ANSWER = 42;
const uint16 ANSWER_IN_BINARY = 0b101010;
`,
expected: `const l/ANSWER uint16
const l/ANSWER_IN_BINARY uint16
library l
`,
},
{
name: "primitives 4",
fidl: `
library l;
const bool ENABLED_FLAG = true;
const int8 OFFSET = -33;
const uint16 ANSWER = 42;
const uint16 ANSWER_IN_BINARY = 0b101010;
const uint32 POPULATION_USA_2018 = 330000000;
const uint64 DIAMOND = 0x183c7effff7e3c18;
const uint64 FUCHSIA = 4054509061583223046;
const string USERNAME = "squeenze";
const float32 MIN_TEMP = -273.15;
const float64 CONVERSION_FACTOR = 1.41421358;
`,
expected: `const l/ANSWER uint16
const l/ANSWER_IN_BINARY uint16
const l/CONVERSION_FACTOR float64
const l/DIAMOND uint64
const l/ENABLED_FLAG bool
const l/FUCHSIA uint64
const l/MIN_TEMP float32
const l/OFFSET int8
const l/POPULATION_USA_2018 uint32
const l/USERNAME string
library l
`,
},
{
name: "bits",
fidl: `
library l;
strict bits Bits1 {
BIT1 = 0x01;
BIT2 = 0x02;
};
`,
expected: `bits/member l/Bits1.BIT1
bits/member l/Bits1.BIT2
strict bits l/Bits1 uint32
library l
`,
},
{
name: "bits 2",
fidl: `
library l;
strict bits Bits1 {
BIT1 = 0x01;
BIT2 = 0x02;
};
strict bits Bits2 {
BIT1 = 0x01;
BIT2 = 0x02;
};
`,
expected: `bits/member l/Bits1.BIT1
bits/member l/Bits1.BIT2
strict bits l/Bits1 uint32
bits/member l/Bits2.BIT1
bits/member l/Bits2.BIT2
strict bits l/Bits2 uint32
library l
`,
},
{
name: "bits 3",
fidl: `
library l;
flexible bits Bits : uint8 {
BIT1 = 0x01;
BIT2 = 0x02;
};
`,
expected: `bits/member l/Bits.BIT1
bits/member l/Bits.BIT2
flexible bits l/Bits uint8
library l
`,
},
{
name: "enums",
fidl: `
library l;
flexible enum Beverage : uint8 {
WATER = 0;
COFFEE = 1;
TEA = 2;
WHISKEY = 3;
};
// Underlying type is assumed to be uint32.
strict enum Vessel {
CUP = 0;
BOWL = 1;
TUREEN = 2;
JUG = 3;
};
`,
expected: `enum/member l/Beverage.COFFEE
enum/member l/Beverage.TEA
enum/member l/Beverage.WATER
enum/member l/Beverage.WHISKEY
flexible enum l/Beverage uint8
enum/member l/Vessel.BOWL
enum/member l/Vessel.CUP
enum/member l/Vessel.JUG
enum/member l/Vessel.TUREEN
strict enum l/Vessel uint32
library l
`,
},
{
name: "struct as precondition for arrays",
fidl: `
library l;
struct S {
float32 x;
};
`,
expected: `struct/member l/S.x float32
struct l/S
library l
`,
},
{
name: "arrays",
fidl: `
library l;
struct Arrays {
array<float32>:16 form;
array<array<string>:4>:10 matrix;
};
`,
expected: `struct/member l/Arrays.form array<float32>:16
struct/member l/Arrays.matrix array<array<string>:4>:10
struct l/Arrays
library l
`,
},
{
name: "strings",
fidl: `
library l;
struct Document {
string:40 title;
string? description;
};
`,
expected: `struct/member l/Document.description string?
struct/member l/Document.title string:40
struct l/Document
library l
`,
},
{
name: "vectors",
fidl: `
library l;
struct Vectors {
vector<int32>:10 params;
bytes blob;
vector<string>:24? nullable_vector_of_strings;
vector<string?> vector_of_nullable_strings;
vector<vector<array<float32>:16>> complex;
};
`,
expected: `struct/member l/Vectors.blob vector<uint8>
struct/member l/Vectors.complex vector<vector<array<float32>:16>>
struct/member l/Vectors.nullable_vector_of_strings vector<string>:24?
struct/member l/Vectors.params vector<int32>:10
struct/member l/Vectors.vector_of_nullable_strings vector<string?>
struct l/Vectors
library l
`,
},
{
name: "handles",
dep: zxLibrary,
fidl: `
library l;
using zx;
resource struct Handles {
// TODO(fxbug.dev/51001): Remove built-in handles.
handle h;
zx.handle:CHANNEL? c;
};
`,
expected: `struct/member l/Handles.c zx/handle:zx/obj_type.CHANNEL?
struct/member l/Handles.h handle
resource struct l/Handles
library l
`,
},
{
name: "struct local type reference",
fidl: `
library l;
struct A {};
struct B {
A a;
};
`,
expected: `struct l/A
struct/member l/B.a l/A
struct l/B
library l
`,
},
{
name: "structs 2",
fidl: `
library l;
struct CirclePoint {
float32 x;
float32 y;
};
struct Color {
float32 r;
float32 g;
float32 b;
};
struct Circle {
bool filled;
CirclePoint center;
float32 radius;
Color? color;
bool dashed;
};
`,
expected: `struct/member l/Circle.center l/CirclePoint
struct/member l/Circle.color l/Color?
struct/member l/Circle.dashed bool
struct/member l/Circle.filled bool
struct/member l/Circle.radius float32
struct l/Circle
struct/member l/CirclePoint.x float32
struct/member l/CirclePoint.y float32
struct l/CirclePoint
struct/member l/Color.b float32
struct/member l/Color.g float32
struct/member l/Color.r float32
struct l/Color
library l
`,
},
{
name: "tables",
fidl: `
library l;
table Profile {
1: vector<string> locales;
2: vector<string> calendars;
3: vector<string> time_zones;
};
`,
expected: `table/member l/Profile.calendars vector<string>
table/member l/Profile.locales vector<string>
table/member l/Profile.time_zones vector<string>
table l/Profile
library l
`,
},
{
name: "unions",
fidl: `
library l;
struct Left {};
struct Right {};
union Either {
1: Left left;
2: Right right;
};
`,
expected: `union/member l/Either.left l/Left
union/member l/Either.right l/Right
strict union l/Either
struct l/Left
struct l/Right
library l
`,
},
{
name: "protocols 1",
fidl: `
library l;
protocol Calculator {
Add(int32 a, int32 b) -> (int32 sum);
};
`,
expected: `protocol/member l/Calculator.Add(int32 a,int32 b) -> (int32 sum)
protocol l/Calculator
library l
`,
},
{
name: "protocols 2",
fidl: `
library l;
struct Foo {};
struct Bar {};
protocol P {
M(Bar? b) -> (Foo c);
};
`,
expected: `struct l/Bar
struct l/Foo
protocol/member l/P.M(l/Bar? b) -> (l/Foo c)
protocol l/P
library l
`,
},
{
name: "protocols 3",
fidl: `
library l;
struct Bar {};
protocol P {};
protocol P2 {
M1(P a);
M2(P? a);
M3(request<P> a);
M4(request<P>? a);
};
`,
expected: `struct l/Bar
protocol l/P
protocol/member l/P2.M1(l/P a)
protocol/member l/P2.M2(l/P? a)
protocol/member l/P2.M3(request<l/P> a)
protocol/member l/P2.M4(request<l/P>? a)
protocol l/P2
library l
`,
},
{
name: "protocols 4",
fidl: `
library l;
protocol P {
-> F1(int32 a);
F2() -> (int32 a);
F3() -> () error int32;
F4();
};
`,
expected: `protocol/member l/P.F1 -> (int32 a)
protocol/member l/P.F2() -> (int32 a)
protocol/member l/P.F3() -> (l/P_F3_Result result)
protocol/member l/P.F4()
protocol l/P
struct l/P_F3_Response
union/member l/P_F3_Result.err int32
union/member l/P_F3_Result.response l/P_F3_Response
strict union l/P_F3_Result
library l
`,
},
{
name: "check types",
fidl: `
library l;
struct S {
string f1;
string:4 f2;
string:4? f3;
};
`,
expected: `struct/member l/S.f1 string
struct/member l/S.f2 string:4
struct/member l/S.f3 string:4?
struct l/S
library l
`,
},
{
name: "with foreign library",
dep: l2Library,
fidl: `
library l;
using l2;
struct A {
l2.T a;
};
`,
expected: `struct/member l/A.a l2/T
struct l/A
library l
`,
},
{
name: "protocol with foreign library",
dep: l2Library,
fidl: `
library l;
using l2;
struct Foo {};
struct Bar {};
protocol Calculator {
Add(l2.T a, Bar b) -> (Foo c);
};
`,
expected: `struct l/Bar
protocol/member l/Calculator.Add(l2/T a,l/Bar b) -> (l/Foo c)
protocol l/Calculator
struct l/Foo
library l
`,
},
{
name: "protocol with foreign library",
dep: l2Library,
fidl: `
library l;
using l2;
struct Foo {};
struct Bar {};
protocol Calculator {
Add(l2.T a, Bar b) -> (Foo c);
};
`,
expected: `struct l/Bar
protocol/member l/Calculator.Add(l2/T a,l/Bar b) -> (l/Foo c)
protocol l/Calculator
struct l/Foo
library l
`,
},
{
name: "reserved keyword",
fidl: `
library l;
union E {
1: reserved;
2: int32 e;
};
table T {
1: reserved;
2: int32 e;
};
`,
expected: `union/member l/E.e int32
strict union l/E
table/member l/T.e int32
table l/T
library l
`,
},
}
runWriteTests(t, tests, Write)
}
func TestWriteJSON(t *testing.T) {
tests := []summaryTestCase{
{
name: "library only",
fidl: `library l;`,
expected: `[
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "primitives 1",
fidl: `
library l;
const int8 OFFSET = -33;
const bool ENABLED_FLAG = true;
`,
expected: `[
{
"name": "l/ENABLED_FLAG",
"kind": "const",
"declaration": "bool"
},
{
"name": "l/OFFSET",
"kind": "const",
"declaration": "int8"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "bits",
fidl: `
library l;
strict bits Bits1 {
BIT1 = 0x01;
BIT2 = 0x02;
};
`,
expected: `[
{
"name": "l/Bits1.BIT1",
"kind": "bits/member"
},
{
"name": "l/Bits1.BIT2",
"kind": "bits/member"
},
{
"name": "l/Bits1",
"kind": "bits",
"declaration": "uint32",
"strictness": "strict"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "bits 2",
fidl: `
library l;
strict bits Bits1 {
BIT1 = 0x01;
BIT2 = 0x02;
};
strict bits Bits2 {
BIT1 = 0x01;
BIT2 = 0x02;
};
`,
expected: `[
{
"name": "l/Bits1.BIT1",
"kind": "bits/member"
},
{
"name": "l/Bits1.BIT2",
"kind": "bits/member"
},
{
"name": "l/Bits1",
"kind": "bits",
"declaration": "uint32",
"strictness": "strict"
},
{
"name": "l/Bits2.BIT1",
"kind": "bits/member"
},
{
"name": "l/Bits2.BIT2",
"kind": "bits/member"
},
{
"name": "l/Bits2",
"kind": "bits",
"declaration": "uint32",
"strictness": "strict"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "bits 3",
fidl: `
library l;
flexible bits Bits : uint8 {
BIT1 = 0x01;
BIT2 = 0x02;
};
`,
expected: `[
{
"name": "l/Bits.BIT1",
"kind": "bits/member"
},
{
"name": "l/Bits.BIT2",
"kind": "bits/member"
},
{
"name": "l/Bits",
"kind": "bits",
"declaration": "uint8",
"strictness": "flexible"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "enums",
fidl: `
library l;
flexible enum Beverage : uint8 {
WATER = 0;
COFFEE = 1;
TEA = 2;
WHISKEY = 3;
};
// Underlying type is assumed to be uint32.
strict enum Vessel {
CUP = 0;
BOWL = 1;
TUREEN = 2;
JUG = 3;
};
`,
expected: `[
{
"name": "l/Beverage.COFFEE",
"kind": "enum/member"
},
{
"name": "l/Beverage.TEA",
"kind": "enum/member"
},
{
"name": "l/Beverage.WATER",
"kind": "enum/member"
},
{
"name": "l/Beverage.WHISKEY",
"kind": "enum/member"
},
{
"name": "l/Beverage",
"kind": "enum",
"declaration": "uint8",
"strictness": "flexible"
},
{
"name": "l/Vessel.BOWL",
"kind": "enum/member"
},
{
"name": "l/Vessel.CUP",
"kind": "enum/member"
},
{
"name": "l/Vessel.JUG",
"kind": "enum/member"
},
{
"name": "l/Vessel.TUREEN",
"kind": "enum/member"
},
{
"name": "l/Vessel",
"kind": "enum",
"declaration": "uint32",
"strictness": "strict"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "struct as precondition for arrays",
fidl: `
library l;
struct S {
float32 x;
};
`,
expected: `[
{
"name": "l/S.x",
"kind": "struct/member",
"declaration": "float32"
},
{
"name": "l/S",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "arrays",
fidl: `
library l;
struct Arrays {
array<float32>:16 form;
array<array<string>:4>:10 matrix;
};
`,
expected: `[
{
"name": "l/Arrays.form",
"kind": "struct/member",
"declaration": "array<float32>:16"
},
{
"name": "l/Arrays.matrix",
"kind": "struct/member",
"declaration": "array<array<string>:4>:10"
},
{
"name": "l/Arrays",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "strings",
fidl: `
library l;
struct Document {
string:40 title;
string? description;
};
`,
expected: `[
{
"name": "l/Document.description",
"kind": "struct/member",
"declaration": "string?"
},
{
"name": "l/Document.title",
"kind": "struct/member",
"declaration": "string:40"
},
{
"name": "l/Document",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "vectors",
fidl: `
library l;
struct Vectors {
vector<int32>:10 params;
bytes blob;
vector<string>:24? nullable_vector_of_strings;
vector<string?> vector_of_nullable_strings;
vector<vector<array<float32>:16>> complex;
};
`,
expected: `[
{
"name": "l/Vectors.blob",
"kind": "struct/member",
"declaration": "vector<uint8>"
},
{
"name": "l/Vectors.complex",
"kind": "struct/member",
"declaration": "vector<vector<array<float32>:16>>"
},
{
"name": "l/Vectors.nullable_vector_of_strings",
"kind": "struct/member",
"declaration": "vector<string>:24?"
},
{
"name": "l/Vectors.params",
"kind": "struct/member",
"declaration": "vector<int32>:10"
},
{
"name": "l/Vectors.vector_of_nullable_strings",
"kind": "struct/member",
"declaration": "vector<string?>"
},
{
"name": "l/Vectors",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "handles",
dep: zxLibrary,
fidl: `
library l;
using zx;
resource struct Handles {
// TODO(fxbug.dev/51001): Remove built-in handles.
handle h;
zx.handle:CHANNEL? c;
};
`,
expected: `[
{
"name": "l/Handles.c",
"kind": "struct/member",
"declaration": "zx/handle:zx/obj_type.CHANNEL?"
},
{
"name": "l/Handles.h",
"kind": "struct/member",
"declaration": "handle"
},
{
"name": "l/Handles",
"kind": "struct",
"resourceness": "resource"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "struct local type reference",
fidl: `
library l;
struct A {};
struct B {
A a;
};
`,
expected: `[
{
"name": "l/A",
"kind": "struct"
},
{
"name": "l/B.a",
"kind": "struct/member",
"declaration": "l/A"
},
{
"name": "l/B",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "structs 2",
fidl: `
library l;
struct CirclePoint {
float32 x;
float32 y;
};
struct Color {
float32 r;
float32 g;
float32 b;
};
struct Circle {
bool filled;
CirclePoint center;
float32 radius;
Color? color;
bool dashed;
};
`,
expected: `[
{
"name": "l/Circle.center",
"kind": "struct/member",
"declaration": "l/CirclePoint"
},
{
"name": "l/Circle.color",
"kind": "struct/member",
"declaration": "l/Color?"
},
{
"name": "l/Circle.dashed",
"kind": "struct/member",
"declaration": "bool"
},
{
"name": "l/Circle.filled",
"kind": "struct/member",
"declaration": "bool"
},
{
"name": "l/Circle.radius",
"kind": "struct/member",
"declaration": "float32"
},
{
"name": "l/Circle",
"kind": "struct"
},
{
"name": "l/CirclePoint.x",
"kind": "struct/member",
"declaration": "float32"
},
{
"name": "l/CirclePoint.y",
"kind": "struct/member",
"declaration": "float32"
},
{
"name": "l/CirclePoint",
"kind": "struct"
},
{
"name": "l/Color.b",
"kind": "struct/member",
"declaration": "float32"
},
{
"name": "l/Color.g",
"kind": "struct/member",
"declaration": "float32"
},
{
"name": "l/Color.r",
"kind": "struct/member",
"declaration": "float32"
},
{
"name": "l/Color",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "tables",
fidl: `
library l;
table Profile {
1: vector<string> locales;
2: vector<string> calendars;
3: vector<string> time_zones;
};
`,
expected: `[
{
"name": "l/Profile.calendars",
"kind": "table/member",
"declaration": "vector<string>"
},
{
"name": "l/Profile.locales",
"kind": "table/member",
"declaration": "vector<string>"
},
{
"name": "l/Profile.time_zones",
"kind": "table/member",
"declaration": "vector<string>"
},
{
"name": "l/Profile",
"kind": "table"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "unions",
fidl: `
library l;
struct Left {};
struct Right {};
union Either {
1: Left left;
2: Right right;
};
`,
expected: `[
{
"name": "l/Either.left",
"kind": "union/member",
"declaration": "l/Left"
},
{
"name": "l/Either.right",
"kind": "union/member",
"declaration": "l/Right"
},
{
"name": "l/Either",
"kind": "union",
"strictness": "strict"
},
{
"name": "l/Left",
"kind": "struct"
},
{
"name": "l/Right",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "protocols 1",
fidl: `
library l;
protocol Calculator {
Add(int32 a, int32 b) -> (int32 sum);
};
`,
expected: `[
{
"name": "l/Calculator.Add",
"kind": "protocol/member",
"declaration": "(int32 a,int32 b) -> (int32 sum)"
},
{
"name": "l/Calculator",
"kind": "protocol"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "protocols 2",
fidl: `
library l;
struct Foo {};
struct Bar {};
protocol P {
M(Bar? b) -> (Foo c);
};
`,
expected: `[
{
"name": "l/Bar",
"kind": "struct"
},
{
"name": "l/Foo",
"kind": "struct"
},
{
"name": "l/P.M",
"kind": "protocol/member",
"declaration": "(l/Bar? b) -> (l/Foo c)"
},
{
"name": "l/P",
"kind": "protocol"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "protocols 3",
fidl: `
library l;
struct Bar {};
protocol P {};
protocol P2 {
M1(P a);
M2(P? a);
M3(request<P> a);
M4(request<P>? a);
};
`,
expected: `[
{
"name": "l/Bar",
"kind": "struct"
},
{
"name": "l/P",
"kind": "protocol"
},
{
"name": "l/P2.M1",
"kind": "protocol/member",
"declaration": "(l/P a)"
},
{
"name": "l/P2.M2",
"kind": "protocol/member",
"declaration": "(l/P? a)"
},
{
"name": "l/P2.M3",
"kind": "protocol/member",
"declaration": "(request<l/P> a)"
},
{
"name": "l/P2.M4",
"kind": "protocol/member",
"declaration": "(request<l/P>? a)"
},
{
"name": "l/P2",
"kind": "protocol"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "protocols 4",
fidl: `
library l;
protocol P {
-> F1(int32 a);
F2() -> (int32 a);
F3() -> () error int32;
F4();
};
`,
expected: `[
{
"name": "l/P.F1",
"kind": "protocol/member",
"declaration": " -> (int32 a)"
},
{
"name": "l/P.F2",
"kind": "protocol/member",
"declaration": "() -> (int32 a)"
},
{
"name": "l/P.F3",
"kind": "protocol/member",
"declaration": "() -> (l/P_F3_Result result)"
},
{
"name": "l/P.F4",
"kind": "protocol/member",
"declaration": "()"
},
{
"name": "l/P",
"kind": "protocol"
},
{
"name": "l/P_F3_Response",
"kind": "struct"
},
{
"name": "l/P_F3_Result.err",
"kind": "union/member",
"declaration": "int32"
},
{
"name": "l/P_F3_Result.response",
"kind": "union/member",
"declaration": "l/P_F3_Response"
},
{
"name": "l/P_F3_Result",
"kind": "union",
"strictness": "strict"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "check types",
fidl: `
library l;
struct S {
string f1;
string:4 f2;
string:4? f3;
};
`,
expected: `[
{
"name": "l/S.f1",
"kind": "struct/member",
"declaration": "string"
},
{
"name": "l/S.f2",
"kind": "struct/member",
"declaration": "string:4"
},
{
"name": "l/S.f3",
"kind": "struct/member",
"declaration": "string:4?"
},
{
"name": "l/S",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "with foreign library",
dep: l2Library,
fidl: `
library l;
using l2;
struct A {
l2.T a;
};
`,
expected: `[
{
"name": "l/A.a",
"kind": "struct/member",
"declaration": "l2/T"
},
{
"name": "l/A",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "protocol with foreign library",
dep: l2Library,
fidl: `
library l;
using l2;
struct Foo {};
struct Bar {};
protocol Calculator {
Add(l2.T a, Bar b) -> (Foo c);
};
`,
expected: `[
{
"name": "l/Bar",
"kind": "struct"
},
{
"name": "l/Calculator.Add",
"kind": "protocol/member",
"declaration": "(l2/T a,l/Bar b) -> (l/Foo c)"
},
{
"name": "l/Calculator",
"kind": "protocol"
},
{
"name": "l/Foo",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "protocol with foreign library 2",
dep: l2Library,
fidl: `
library l;
using l2;
struct Foo {};
struct Bar {};
protocol Calculator {
Add(l2.T a, Bar b) -> (Foo c);
};
`,
expected: `[
{
"name": "l/Bar",
"kind": "struct"
},
{
"name": "l/Calculator.Add",
"kind": "protocol/member",
"declaration": "(l2/T a,l/Bar b) -> (l/Foo c)"
},
{
"name": "l/Calculator",
"kind": "protocol"
},
{
"name": "l/Foo",
"kind": "struct"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
{
name: "reserved keyword",
fidl: `
library l;
union E {
1: reserved;
2: int32 e;
};
table T {
1: reserved;
2: int32 e;
};
`,
expected: `[
{
"name": "l/E.e",
"kind": "union/member",
"declaration": "int32"
},
{
"name": "l/E",
"kind": "union",
"strictness": "strict"
},
{
"name": "l/T.e",
"kind": "table/member",
"declaration": "int32"
},
{
"name": "l/T",
"kind": "table"
},
{
"name": "l",
"kind": "library"
}
]
`,
},
}
runWriteTests(t, tests, WriteJSON)
}
func runWriteTests(t *testing.T, tests []summaryTestCase, writeFn func(fidlgen.Root, io.Writer) error) {
t.Helper()
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
c := fidlgentest.EndToEndTest{T: t}
if test.dep != "" {
c = c.WithDependency(test.dep)
}
r := c.Single(test.fidl)
var sb strings.Builder
if err := writeFn(r, &sb); err != nil {
t.Fatalf("while summarizing file: %v", err)
}
actual := strings.Split(sb.String(), "\n")
expected := strings.Split(test.expected, "\n")
if !cmp.Equal(expected, actual) {
t.Errorf("expected:\n---BEGIN---\n%+v\n---END---\n\n"+
"actual:\n---BEGIN---\n%+v\n---END---\n\ndiff:\n%v\n\nroot: %+v",
test.expected, sb.String(),
cmp.Diff(expected, actual), r)
}
})
}
}