Packages
This is a flatbuffers implementation in Elixir. In contrast to existing implementations there is no need to compile code from a schema. Instead, data and schemas are processed dynamically at runtime, offering greater flexibility.
Current section
Files
Jump to
Current section
Files
test/eflatbuffers_test.exs
defmodule EflatbuffersTest do
use ExUnit.Case
import TestHelpers
doctest Eflatbuffers
def before_test do
flush_port_commands()
end
test "creating test data" do
expected = <<12, 0, 0, 0, 8, 0, 8, 0, 6, 0, 0, 0, 8, 0, 0, 0, 0, 0, 17, 0>>
assert expected == reference_fb(:simple_table, %{field_a: 17})
end
### complete flatbuffer binaries
test "table of scalars" do
map = %{
my_byte: 66,
my_ubyte: 200,
my_bool: true,
my_short: -23,
my_ushort: 42,
my_int: -1000,
my_uint: 1000,
my_float: 3.124,
my_long: -10000000,
my_ulong: 10000000,
my_double: 3.141593,
}
assert_full_circle(:all_my_scalars, map)
end
test "table of scalars with defaults" do
map = %{
my_byte: -7,
my_ubyte: 7,
my_bool: true,
my_short: -7,
my_ushort: 7,
my_int: -7,
my_uint: 7,
my_float: -7,
my_long: -7,
my_ulong: 7,
my_double: -7,
}
assert_full_circle(:defaults, map)
end
test "read simple table" do
map = %{
field_a: 42,
field_b: 23,
}
assert_full_circle(:simple_table, map)
end
test "read simple table with extended schema" do
map = %{
field_a: 42,
field_b: 23,
}
assert_full_circle(:simple_table_plus, :simple_table, map)
end
test "read table with missing values" do
map = %{}
assert_full_circle(:simple_table, map)
end
test "table with scalar vector" do
map = %{
int_vector: [23, 42, 666],
}
assert_full_circle(:int_vector, map)
end
test "table with string vector" do
map = %{
string_vector: ["foo", "bar", "baz"],
}
assert_full_circle(:string_vector, map)
end
test "table with enum" do
map = %{
enum_field: "Green",
}
assert_full_circle(:enum_field, map)
assert_full_circle(:enum_field, %{})
end
test "vector of enum" do
map = %{
enum_fields: ["Blue", "Green", "Red"]
}
# writing
{:ok, reply} = Eflatbuffers.write(map, load_schema(:vector_of_enums))
assert(map == Eflatbuffers.read!(reply, load_schema(:vector_of_enums)))
end
test "table with union" do
map = %{
data: %{greeting: 42},
data_type: "bye",
additions_value: 123
}
assert_full_circle(:union_field, map)
end
test "table with table vector" do
map = %{
inner: [%{value_inner: "aaa"}],
}
assert_full_circle(:table_vector, map)
end
#test "nested vectors (not supported by flatc)" do
# map = %{
# the_vector: [[1,2,3],[4,5,6]],
# }
# # writing
# {:ok, reply} = Eflatbuffers.write(map, load_schema(:nested_vector))
# assert(map == Eflatbuffers.read!(reply, load_schema(:nested_vector)))
#end
test "fb with string" do
map = %{
my_string: "hello",
my_bool: true,
}
assert_full_circle(:string_table, map)
end
test "config debug fb" do
map = %{technologies: [%{category: "aaa"}, %{}]}
assert_full_circle(:config_path, map)
end
test "config fb" do
{:ok, schema} = Eflatbuffers.Schema.parse(load_schema({:doge, :config}))
map = Poison.decode!(File.read!("test/complex_schemas/config.json"), [keys: :atoms])
# writing
reply = Eflatbuffers.write!(map, schema)
reply_map = Eflatbuffers.read!(reply, schema)
assert [] == compare_with_defaults(round_floats(map), round_floats(reply_map), schema)
assert_full_circle({:doge, :config}, map)
end
test "commands fb" do
maps = [
%{data_type: "RefineryStartedCommand", data: %{} },
%{data_type: "CraftingFinishedCommand", data: %{} },
%{data_type: "MoveBuildingCommand", data: %{from: %{x: 23, y: 11}, to: %{x: 42, y: -1}} },
]
Enum.each(
maps,
fn(map) -> assert_full_circle({:doge, :commands}, map) end
)
end
test "read nested table" do
map = %{
value_outer: 42,
inner: %{ value_inner: 23 }
}
assert_full_circle(:nested, map)
end
test "write fb" do
map = %{my_bool: true, my_string: "max", my_second_string: "minimum"}
assert_full_circle(:table_bool_string_string, map)
end
test "no file identifier" do
fb = Eflatbuffers.write!(%{}, load_schema(:no_identifier))
assert << _ :: size(4)-binary >> <> << 0, 0, 0, 0 >> <> << _ :: binary >> = fb
end
test "file identifier" do
fb_id = Eflatbuffers.write!(%{}, load_schema( :identifier))
fb_no_id = Eflatbuffers.write!(%{}, load_schema(:no_identifier))
assert << _ :: size(32) >> <> "helo" <> << _ :: binary >> = fb_id
assert << _ :: size(32) >> <> << 0, 0, 0, 0 >> <> << _ :: binary >> = fb_no_id
assert %{} == Eflatbuffers.read!(fb_id, load_schema(:no_identifier))
assert {:error, {:identifier_mismatch, %{data: <<0, 0, 0, 0>>, schema: "helo"}}} ==
catch_throw(Eflatbuffers.read!(fb_no_id, load_schema(:identifier)))
assert_full_circle(:identifier, %{})
assert_full_circle(:no_identifier, %{})
end
test "path errors" do
map = %{foo: true, tables_field: [%{string_field: "hello"}]}
assert_full_circle(:error, map)
map = %{foo: true, tables_field: [%{}, %{bar: 3, string_field: 23}]}
assert {:error, {:wrong_type, :string, 23, [{:tables_field}, [1], {:string_field}]}} ==
catch_throw(Eflatbuffers.write!(map, Eflatbuffers.parse_schema!(load_schema(:error))))
map = %{foo: true, tables_field: [%{}, "hoho!"]}
assert {:error, {:wrong_type, :table, "hoho!", [{:tables_field}, [1]]}} ==
catch_throw(Eflatbuffers.write!(map, Eflatbuffers.parse_schema!(load_schema(:error))))
map = %{foo: true, tables_field: 123}
assert {:error, {:wrong_type, :vector, 123, [{:tables_field}]}} ==
catch_throw(Eflatbuffers.write!(map, Eflatbuffers.parse_schema!(load_schema(:error))))
end
end