Merge commit '0f6aab9da6fe982218a01f4a5b896e65fcced437' as 'third_party/flatbuffers'

This commit is contained in:
Siarhei Fedartsou
2024-06-22 13:33:34 +02:00
1814 changed files with 326902 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
include "baz/baz.fbs";
table Bar {
baz:Baz;
}
@@ -0,0 +1,6 @@
include "foo.fbs";
include "baz/baz.fbs";
table BarWithFoo {
foo:Foo;
}
+14
View File
@@ -0,0 +1,14 @@
include "baz/baz_with_ns.fbs";
include "baz/baz.fbs";
namespace bar;
table Bar {
baz:baz.Baz;
baz2:Baz;
foo:Foo;
}
table Foo {
a:int;
}
+6
View File
@@ -0,0 +1,6 @@
enum Baz : short {
None = 0,
Red,
Green,
Blue,
}
@@ -0,0 +1,8 @@
namespace baz;
enum Baz : short {
None = 0,
Red,
Green,
Blue,
}
@@ -0,0 +1,8 @@
attribute display_name;
enum ValAttributes : int
{
Val1 = 0 (display_name: "Value 1"),
Val2 (display_name: "Value 2"),
Val3 (deprecated, display_name: "Value 3 (deprecated)"),
}
+254
View File
@@ -0,0 +1,254 @@
# Copyright 2022 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from flatc_test import *
class CppTests:
def Flatten(self):
# Generate just foo with a "flatten" import of bar.
flatc(["--cpp", "foo.fbs"])
# Foo should be generated in place and include bar flatten
assert_file_and_contents("foo_generated.h", '#include "bar_generated.h"')
def FlattenAbsolutePath(self):
# Generate just foo with a "flatten" import of bar.
flatc(["--cpp", make_absolute("foo.fbs")])
# Foo should be generated in place and include bar flatten
assert_file_and_contents("foo_generated.h", '#include "bar_generated.h"')
def FlattenSubDirectory(self):
# Generate just foo with a "flatten" import of bar.
flatc(["--cpp", "bar/bar.fbs"])
# Bar should be generated in place and include baz
assert_file_and_contents("bar_generated.h", '#include "baz_generated.h"')
def FlattenOutPath(self):
# Generate just foo with a "flatten" import of bar.
flatc(["--cpp", "-o", ".tmp", "foo.fbs"])
# Foo should be generated in the out path and include bar flatten to the out path.
assert_file_and_contents(".tmp/foo_generated.h", '#include "bar_generated.h"')
def FlattenOutPathSuperDirectory(self):
# Generate just foo with a "flatten" import of bar.
flatc(["--cpp", "-o", "../.tmp", "foo.fbs"])
# Foo should be generated in the out path and include bar flatten to the out path.
assert_file_and_contents(
"../.tmp/foo_generated.h", '#include "bar_generated.h"'
)
def FlattenOutPathSubDirectory(self):
# Generate just foo with a "flatten" import of bar.
flatc(["--cpp", "-o", ".tmp", "bar/bar.fbs"])
# Bar should be generated in the out path and include baz flatten to the out path.
assert_file_and_contents(".tmp/bar_generated.h", '#include "baz_generated.h"')
def KeepPrefix(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--keep-prefix", "foo.fbs"])
assert_file_and_contents("foo_generated.h", '#include "bar/bar_generated.h"')
def KeepPrefixAbsolutePath(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--keep-prefix", make_absolute("foo.fbs")])
assert_file_and_contents("foo_generated.h", '#include "bar/bar_generated.h"')
def KeepPrefixSubDirectory(self):
# Generate with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--keep-prefix", "bar/bar.fbs"])
assert_file_and_contents("bar_generated.h", '#include "baz/baz_generated.h"')
def KeepPrefixOutPath(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--keep-prefix", "-o", ".tmp", "foo.fbs"])
assert_file_and_contents(
".tmp/foo_generated.h",
'#include "bar/bar_generated.h"',
)
def KeepPrefixOutPathSubDirectory(self):
# Generate with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--keep-prefix", "-o", ".tmp", "bar/bar.fbs"])
assert_file_and_contents(
".tmp/bar_generated.h", '#include "baz/baz_generated.h"'
)
def IncludePrefix(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--include-prefix", "test", "foo.fbs"])
assert_file_and_contents("foo_generated.h", '#include "test/bar_generated.h"')
def IncludePrefixAbolutePath(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--include-prefix", "test", make_absolute("foo.fbs")])
assert_file_and_contents("foo_generated.h", '#include "test/bar_generated.h"')
def IncludePrefixSubDirectory(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--include-prefix", "test", "bar/bar.fbs"])
assert_file_and_contents("bar_generated.h", '#include "test/baz_generated.h"')
def IncludePrefixOutPath(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--include-prefix", "test", "-o", ".tmp", "foo.fbs"])
assert_file_and_contents(
".tmp/foo_generated.h", '#include "test/bar_generated.h"'
)
def IncludePrefixOutPathSubDirectory(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--include-prefix", "test", "-o", ".tmp", "bar/bar.fbs"])
assert_file_and_contents(
".tmp/bar_generated.h", '#include "test/baz_generated.h"'
)
def KeepPrefixIncludePrefix(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--keep-prefix", "--include-prefix", "test", "foo.fbs"])
# The include prefix should come first, with the kept prefix next.
assert_file_and_contents(
"foo_generated.h", '#include "test/bar/bar_generated.h"'
)
def KeepPrefixIncludePrefixAbsolutePath(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(
[
"--cpp",
"--keep-prefix",
"--include-prefix",
"test",
make_absolute("foo.fbs"),
]
)
# The include prefix should come first, with the kept prefix next.
assert_file_and_contents(
"foo_generated.h", '#include "test/bar/bar_generated.h"'
)
def KeepPrefixIncludePrefixSubDirectory(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(["--cpp", "--keep-prefix", "--include-prefix", "test", "bar/bar.fbs"])
# The include prefix should come first, with the kept prefix next.
assert_file_and_contents(
"bar_generated.h", '#include "test/baz/baz_generated.h"'
)
def KeepPrefixIncludePrefixOutPathSubDirectory(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(
[
"--cpp",
"--keep-prefix",
"--include-prefix",
"test",
"-o",
".tmp",
"bar/bar.fbs",
]
)
# The include prefix should come first, with the kept prefix next.
assert_file_and_contents(
".tmp/bar_generated.h", '#include "test/baz/baz_generated.h"'
)
def KeepPrefixIncludePrefixOutPathSuperDirectory(self):
# Generate just foo with the import of bar keeping the prefix of where it is located.
flatc(
[
"--cpp",
"--keep-prefix",
"--include-prefix",
"test",
"-o",
"../.tmp",
"bar/bar.fbs",
]
)
# The include prefix should come first, with the kept prefix next.
assert_file_and_contents(
"../.tmp/bar_generated.h", '#include "test/baz/baz_generated.h"'
)
def KeepPrefixIncludePrefixoutPathAbsoluePaths_SuperDirectoryReference(self):
# Generate bar_with_foo that references a type in a super directory.
flatc(
[
"--cpp",
"--keep-prefix",
"--include-prefix",
"generated",
"-I",
str(script_path.absolute()),
"-o",
str(Path(script_path, ".tmp").absolute()),
str(Path(script_path, "bar/bar_with_foo.fbs").absolute()),
]
)
# The include prefix should come first, with the kept prefix next.
assert_file_and_contents(
".tmp/bar_with_foo_generated.h",
[
'#include "generated/baz/baz_generated.h"',
'#include "generated/foo_generated.h"',
],
)
def KeepPrefixIncludePrefixoutPath_SuperDirectoryReference(self):
# Generate bar_with_foo that references a type in a super directory.
flatc(
[
"--cpp",
"--keep-prefix",
"--include-prefix",
"generated",
"-I",
"./",
"-o",
".tmp",
"bar/bar_with_foo.fbs",
]
)
# The include prefix should come first, with the kept prefix next.
assert_file_and_contents(
".tmp/bar_with_foo_generated.h",
[
'#include "generated/baz/baz_generated.h"',
'#include "generated/foo_generated.h"',
],
unlink=False,
)
@@ -0,0 +1,32 @@
# Copyright 2022 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from flatc_test import *
class KotlinTests:
def EnumValAttributes(self):
flatc(["--kotlin", "enum_val_attributes.fbs"])
subject = assert_file_exists("ValAttributes.kt")
assert_file_doesnt_contains(subject, 'val names : Array<String> = arrayOf("Val1", "Val2", "Val3")')
assert_file_doesnt_contains(subject, 'fun name(e: Int) : String = names[e]')
def EnumValAttributes_ReflectNames(self):
flatc(["--kotlin", "--reflect-names", "enum_val_attributes.fbs"])
subject = assert_file_exists("ValAttributes.kt")
assert_file_contains(subject, 'val names : Array<String> = arrayOf("Val1", "Val2", "Val3")')
assert_file_contains(subject, 'fun name(e: Int) : String = names[e]')
@@ -0,0 +1,43 @@
# Copyright 2022 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from flatc_test import *
import json
class SchemaTests:
def EnumValAttributes(self):
# Generate .bfbs schema first
flatc(["--schema", "--binary", "--bfbs-builtins", "enum_val_attributes.fbs"])
assert_file_exists("enum_val_attributes.bfbs")
# Then turn it into JSON
flatc(["--json", "--strict-json", str(reflection_fbs_path()), "--", "enum_val_attributes.bfbs"])
# The attributes should be present in JSON
schema_json = json.loads(get_file_contents("enum_val_attributes.json"))
assert schema_json["enums"][0]["name"] == "ValAttributes"
assert schema_json["enums"][0]["values"][0]["name"] == "Val1"
assert schema_json["enums"][0]["values"][0]["attributes"][0]["key"] == "display_name"
assert schema_json["enums"][0]["values"][0]["attributes"][0]["value"] == "Value 1"
assert schema_json["enums"][0]["values"][1]["name"] == "Val2"
assert schema_json["enums"][0]["values"][1]["attributes"][0]["key"] == "display_name"
assert schema_json["enums"][0]["values"][1]["attributes"][0]["value"] == "Value 2"
assert schema_json["enums"][0]["values"][2]["name"] == "Val3"
assert schema_json["enums"][0]["values"][2]["attributes"][0]["key"] == "deprecated"
assert schema_json["enums"][0]["values"][2]["attributes"][1]["key"] == "display_name"
assert schema_json["enums"][0]["values"][2]["attributes"][1]["value"] == "Value 3 (deprecated)"
+139
View File
@@ -0,0 +1,139 @@
# Copyright 2022 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import platform
import subprocess
from pathlib import Path
parser = argparse.ArgumentParser()
parser.add_argument(
"--flatc", help="path of the Flat C compiler relative to the root directory"
)
args = parser.parse_args()
# Get the path where this script is located so we can invoke the script from
# any directory and have the paths work correctly.
script_path = Path(__file__).parent.resolve()
# Get the root path as an absolute path, so all derived paths are absolute.
root_path = script_path.parent.parent.absolute()
# Get the location of the flatc executable, reading from the first command line
# argument or defaulting to default names.
flatc_exe = Path(
("flatc" if not platform.system() == "Windows" else "flatc.exe")
if not args.flatc
else args.flatc
)
# Find and assert flatc compiler is present.
if root_path in flatc_exe.parents:
flatc_exe = flatc_exe.relative_to(root_path)
flatc_path = Path(root_path, flatc_exe)
assert flatc_path.exists(), "Cannot find the flatc compiler " + str(flatc_path)
# Execute the flatc compiler with the specified parameters
def flatc(options, cwd=script_path):
cmd = [str(flatc_path)] + options
subprocess.check_call(cmd, cwd=str(cwd))
def reflection_fbs_path():
return Path(root_path).joinpath("reflection", "reflection.fbs")
def make_absolute(filename, path=script_path):
return str(Path(path, filename).absolute())
def assert_file_exists(filename, path=script_path):
file = Path(path, filename)
assert file.exists(), "could not find file: " + filename
return file
def assert_file_doesnt_exists(filename, path=script_path):
file = Path(path, filename)
assert not file.exists(), "file exists but shouldn't: " + filename
return file
def get_file_contents(filename, path=script_path):
file = Path(path, filename)
contents = ""
with open(file) as file:
contents = file.read()
return contents
def assert_file_contains(file, needles):
with open(file) as file:
contents = file.read()
for needle in [needles] if isinstance(needles, str) else needles:
assert needle in contents, (
"coudn't find '" + needle + "' in file: " + str(file)
)
return file
def assert_file_doesnt_contains(file, needles):
with open(file) as file:
contents = file.read()
for needle in [needles] if isinstance(needles, str) else needles:
assert needle not in contents, (
"Found unexpected '" + needle + "' in file: " + str(file)
)
return file
def assert_file_and_contents(
file, needle, doesnt_contain=None, path=script_path, unlink=True
):
assert_file_contains(assert_file_exists(file, path), needle)
if doesnt_contain:
assert_file_doesnt_contains(assert_file_exists(file, path), doesnt_contain)
if unlink:
Path(path, file).unlink()
def run_all(*modules):
failing = 0
passing = 0
for module in modules:
methods = [
func
for func in dir(module)
if callable(getattr(module, func)) and not func.startswith("__")
]
module_failing = 0
module_passing = 0
for method in methods:
try:
print("{0}.{1}".format(module.__name__, method))
getattr(module, method)(module)
print(" [PASSED]")
module_passing = module_passing + 1
except Exception as e:
print(" [FAILED]: " + str(e))
module_failing = module_failing + 1
print(
"{0}: {1} of {2} passsed".format(
module.__name__, module_passing, module_passing + module_failing
)
)
passing = passing + module_passing
failing = failing + module_failing
return passing, failing
+242
View File
@@ -0,0 +1,242 @@
# Copyright 2022 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from flatc_test import *
class TsTests():
def Base(self):
# Generate just foo with no extra arguments
flatc(["--ts", "foo.fbs"])
# Should generate the module that exports both foo and its direct
# include, bar.
assert_file_and_contents(
"foo_generated.ts",
[
"export { Bar } from './bar.js';",
"export { Foo } from './foo.js';",
],
)
# Foo should be generated in place and exports the Foo table.
assert_file_and_contents("foo.ts", "export class Foo {")
# Included files, like bar, should not be generated.
assert_file_doesnt_exists("bar.ts")
def BaseMultipleFiles(self):
# Generate both foo and bar with no extra arguments
flatc(["--ts", "foo.fbs", "bar/bar.fbs"])
# Should generate the module that exports both foo and its direct
# include, bar.
assert_file_and_contents(
"foo_generated.ts",
[
"export { Bar } from './bar.js';",
"export { Foo } from './foo.js';",
],
)
# Foo should be generated in place and exports the Foo table.
assert_file_and_contents("foo.ts", "export class Foo {")
# Bar should also be generatd in place and exports the Bar table.
assert_file_and_contents("bar.ts", "export class Bar {")
def BaseWithNamespace(self):
# Generate foo with namespacing, with no extra arguments
flatc(["--ts", "foo_with_ns.fbs"])
# Should generate the module that exports both foo in its namespace
# directory and its direct include, bar.
assert_file_and_contents(
"foo_with_ns_generated.ts",
[
"export { Bar } from './bar/bar.js';",
"export { Foo } from './something/foo.js';",
],
)
# Foo should be placed in the namespaced directory. It should export
# Foo, and the import of Bar should be relative to its location.
assert_file_and_contents(
"something/foo.ts",
[
"export class Foo {",
"import { Bar } from '../bar/bar.js';",
],
)
# Included files, like bar, should not be generated.
assert_file_doesnt_exists("bar.ts")
def GenAll(self):
# Generate foo with generate all options
flatc(["--ts", "--gen-all", "foo.fbs"])
# Should generate a single file that exports all the generated types.
assert_file_and_contents(
"foo_generated.ts",
[
"export { Bar } from './bar.js'",
"export { Baz } from './baz.js'",
"export { Foo } from './foo.js'",
],
)
# Foo should be generated with an import to Bar and an export of itself.
assert_file_and_contents(
"foo.ts",
[
"import { Bar } from './bar.js';",
"export class Foo {",
],
)
# Bar should be generated with an import to Baz and an export of itself.
assert_file_and_contents(
"bar.ts",
[
"import { Baz } from './baz.js';",
"export class Bar {",
],
)
# Baz should be generated with an export of itself.
assert_file_and_contents(
"baz.ts",
[
"export enum Baz {",
],
)
def FlatFiles(self):
# Generate just foo with the flat files option
flatc(["--ts", "--ts-flat-files", "foo.fbs"])
# Should generate a single file that imports bar as a single file, and
# exports the Foo table.
assert_file_and_contents(
"foo_generated.ts",
[
"import {Bar as Bar} from './bar_generated.js';",
"export class Foo {",
],
)
# The root type Foo should not be generated in its own file.
assert_file_doesnt_exists("foo.ts")
def FlatFilesWithNamespace(self):
# Generate just foo with the flat files option
flatc(["--ts", "--ts-flat-files", "foo_with_ns.fbs"])
# Should generate a single file that imports bar as a single file, and
# exports the Foo table.
assert_file_and_contents(
"foo_with_ns_generated.ts",
[
"import {Bar as Bar} from './bar_with_ns_generated.js';",
"export class Foo {",
],
)
# The root type Foo should not be generated in its own file.
assert_file_doesnt_exists("foo.ts")
def FlatFilesMultipleFiles(self):
# Generate both foo and bar with the flat files option
flatc(["--ts", "--ts-flat-files", "foo.fbs", "bar/bar.fbs"])
# Should generate a single foo file that imports bar as a single file,
# and exports the Foo table.
assert_file_and_contents(
"foo_generated.ts",
[
"import {Bar as Bar} from './bar_generated.js';",
"export class Foo {",
],
)
# Should generate a single bar file that imports bar as a single file,
# and exports the Bar table.
assert_file_and_contents(
"bar_generated.ts",
[
"import {Baz as Baz} from './baz_generated.js';",
"export class Bar {",
],
)
# The types Foo and Bar should not be generated in their own files
assert_file_doesnt_exists("foo.ts")
assert_file_doesnt_exists("bar.ts")
def FlatFilesGenAll(self):
# Generate foo with all of its dependents with the flat files option
flatc(["--ts", "--ts-flat-files", "--gen-all", "foo.fbs"])
# Should generate a single foo file
assert_file_and_contents(
"foo_generated.ts",
# Should export each of the types within the single file
[
"export class Foo {",
"export class Bar {",
"export enum Baz {",
],
# No includes for the dependent types should be present.
doesnt_contain=[
"import {Bar as Bar}",
"import {Baz as Baz}",
],
)
# The types Foo, Bar and Baz should not be generated in their own files.
assert_file_doesnt_exists("foo.ts")
assert_file_doesnt_exists("bar.ts")
assert_file_doesnt_exists("baz.ts")
def ZFlatFilesGenAllWithNamespacing(self):
# Generate foo with all of its dependents with the flat files option
flatc(["--ts", "--ts-flat-files", "--gen-all", "foo_with_ns.fbs"])
# Should generate a single foo file
assert_file_and_contents(
"foo_with_ns_generated.ts",
# Should export each of the types within the single file
[
"export class bar_Bar {",
"export class bar_Foo {",
"export enum Baz {",
"export enum baz_Baz {",
"export class something_Foo {"
],
# No includes for the dependent types should be present.
doesnt_contain=[
"import {Bar as Bar}",
"import {Baz as Baz}",
],
)
# The types Foo, Bar and Baz should not be generated in their own files.
assert_file_doesnt_exists("foo.ts")
assert_file_doesnt_exists("bar.ts")
assert_file_doesnt_exists("baz.ts")
+9
View File
@@ -0,0 +1,9 @@
include "bar/bar.fbs";
include "bar/bar_with_ns.fbs";
table Foo {
bar:Bar;
bar2:bar.Bar;
}
root_type Foo;
+9
View File
@@ -0,0 +1,9 @@
include "bar/bar_with_ns.fbs";
namespace something;
table Foo {
bar:bar.Bar;
}
root_type Foo;
+31
View File
@@ -0,0 +1,31 @@
#!/usr/bin/env python3
#
# Copyright 2022 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
from flatc_test import run_all
from flatc_cpp_tests import CppTests
from flatc_kotlin_tests import KotlinTests
from flatc_ts_tests import TsTests
from flatc_schema_tests import SchemaTests
passing, failing = run_all(CppTests, KotlinTests, TsTests, SchemaTests)
print("")
print("{0} of {1} tests passed".format(passing, passing + failing))
if failing > 0:
sys.exit(1)