diff --git a/lib/harald/error_code.ex b/lib/harald/error_code.ex index a937f65..2e88958 100644 --- a/lib/harald/error_code.ex +++ b/lib/harald/error_code.ex @@ -8,7 +8,6 @@ defmodule Harald.ErrorCode do Reference: Version 5.0, Vol 2, Part D, 1 ## Non-standard Names - For error codes `0x2B`, `0x31`, and `0x33`, their respective names are suffixed like ` (0x2B)` as to differentiate between the three when serializing. """ @@ -88,9 +87,13 @@ defmodule Harald.ErrorCode do Enum.each(@error_codes, fn {error_code, name} -> - def name(unquote(error_code)), do: unquote(name) - def error_code(unquote(name)), do: unquote(error_code) + def name(unquote(error_code)), do: {:ok, unquote(name)} + def error_code(unquote(name)), do: {:ok, unquote(error_code)} end) + def name(_), do: :error + + def error_code(_), do: :error + def all, do: @error_codes end diff --git a/lib/harald/hci/event/inquiry_complete.ex b/lib/harald/hci/event/inquiry_complete.ex index 2c93485..57a1428 100644 --- a/lib/harald/hci/event/inquiry_complete.ex +++ b/lib/harald/hci/event/inquiry_complete.ex @@ -23,10 +23,20 @@ defmodule Harald.HCI.Event.InquiryComplete do def event_code, do: @event_code @impl Serializable - def serialize(%__MODULE__{status: status}), do: {:ok, <>} + def serialize(%__MODULE__{status: status} = data) do + case ErrorCode.error_code(status) do + {:ok, error_code} -> {:ok, <>} + :error -> {:error, data} + end + end @impl Serializable - def deserialize(<>), do: {:ok, %__MODULE__{status: ErrorCode.name(status)}} + def deserialize(<>) do + case ErrorCode.name(status) do + {:ok, name} -> {:ok, %__MODULE__{status: name}} + :error -> {:error, %__MODULE__{status: status}} + end + end def deserialize(bin), do: {:error, bin} end diff --git a/test/harald/hci/event/inquiry_complete_test.exs b/test/harald/hci/event/inquiry_complete_test.exs new file mode 100644 index 0000000..3c7d7c7 --- /dev/null +++ b/test/harald/hci/event/inquiry_complete_test.exs @@ -0,0 +1,28 @@ +defmodule Harald.HCI.Event.InquiryCompleteTest do + use ExUnit.Case, async: true + use ExUnitProperties + alias Harald.Generators.HCI.Event.InquiryComplete, as: InquiryCompleteGen + alias Harald.HCI.Event.InquiryComplete + + doctest InquiryComplete, import: true + + property "symmetric serialization" do + check all parameters <- InquiryCompleteGen.parameters() do + case InquiryComplete.deserialize(parameters) do + {:ok, data} -> + assert {:ok, bin} = InquiryComplete.serialize(data) + assert :binary.bin_to_list(parameters) == :binary.bin_to_list(bin) + + {:error, _} -> + :ok + end + end + + check all parameters <- StreamData.binary() do + case InquiryComplete.deserialize(parameters) do + {:ok, data} -> assert {:ok, parameters} == InquiryComplete.serialize(data) + {:error, _} -> :ok + end + end + end +end