Serenity Operating System
1/*
2 * Copyright (c) 2020, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibTest/TestCase.h>
8
9#include <AK/MACAddress.h>
10#include <AK/Types.h>
11
12TEST_CASE(should_default_construct)
13{
14 constexpr MACAddress sut {};
15 static_assert(sut.is_zero());
16 EXPECT(sut.is_zero());
17}
18
19TEST_CASE(should_braces_construct)
20{
21 constexpr MACAddress sut { 1, 2, 3, 4, 5, 6 };
22 static_assert(!sut.is_zero());
23 EXPECT(!sut.is_zero());
24}
25
26TEST_CASE(should_construct_from_6_octets)
27{
28 constexpr MACAddress sut(1, 2, 3, 4, 5, 6);
29 static_assert(!sut.is_zero());
30 EXPECT(!sut.is_zero());
31}
32
33TEST_CASE(should_provide_read_access_to_octet_by_index)
34{
35 constexpr auto is_all_expected = [](auto& sut) {
36 for (auto i = 0u; i < sizeof(MACAddress); ++i) {
37 if (sut[i] != i + 1) {
38 return false;
39 }
40 }
41 return true;
42 };
43
44 constexpr MACAddress sut(1, 2, 3, 4, 5, 6);
45
46 static_assert(is_all_expected(sut));
47
48 for (auto i = 0u; i < sizeof(MACAddress); ++i) {
49 EXPECT_EQ(i + 1, sut[i]);
50 }
51}
52
53TEST_CASE(should_provide_write_access_to_octet_by_index)
54{
55 constexpr auto sut = [] {
56 MACAddress m {};
57 for (auto i = 0u; i < sizeof(MACAddress); ++i) {
58 m[i] = i + 1;
59 }
60 return m;
61 }();
62
63 constexpr MACAddress expected(1, 2, 3, 4, 5, 6);
64
65 static_assert(expected == sut);
66}
67
68TEST_CASE(should_equality_compare)
69{
70 constexpr MACAddress a(1, 2, 3, 4, 5, 6);
71 constexpr MACAddress b(1, 2, 3, 42, 5, 6);
72
73 static_assert(a == a);
74 static_assert(a != b);
75
76 EXPECT(a == a);
77 EXPECT(a != b);
78}
79
80TEST_CASE(should_string_format)
81{
82 MACAddress sut(1, 2, 3, 4, 5, 6);
83 EXPECT_EQ("01:02:03:04:05:06", sut.to_deprecated_string());
84}
85
86TEST_CASE(should_make_mac_address_from_string_numbers)
87{
88 auto const sut = MACAddress::from_string("01:02:03:04:05:06"sv);
89
90 EXPECT(sut.has_value());
91 EXPECT_EQ(1, sut.value()[0]);
92 EXPECT_EQ(2, sut.value()[1]);
93 EXPECT_EQ(3, sut.value()[2]);
94 EXPECT_EQ(4, sut.value()[3]);
95 EXPECT_EQ(5, sut.value()[4]);
96 EXPECT_EQ(6, sut.value()[5]);
97}
98
99TEST_CASE(should_make_mac_address_from_string_letters)
100{
101 auto const sut = MACAddress::from_string("de:ad:be:ee:ee:ef"sv);
102
103 EXPECT(sut.has_value());
104 EXPECT_EQ(u8 { 0xDE }, sut.value()[0]);
105 EXPECT_EQ(u8 { 0xAD }, sut.value()[1]);
106 EXPECT_EQ(u8 { 0xBE }, sut.value()[2]);
107 EXPECT_EQ(u8 { 0xEE }, sut.value()[3]);
108 EXPECT_EQ(u8 { 0xEE }, sut.value()[4]);
109 EXPECT_EQ(u8 { 0xEF }, sut.value()[5]);
110}
111
112TEST_CASE(should_make_empty_optional_from_bad_string)
113{
114 auto const sut = MACAddress::from_string("bad string"sv);
115
116 EXPECT(!sut.has_value());
117}
118
119TEST_CASE(should_make_empty_optional_from_out_of_range_values)
120{
121 auto const sut = MACAddress::from_string("de:ad:be:ee:ee:fz"sv);
122
123 EXPECT(!sut.has_value());
124}