net/addr/subnet: Add ToStr conversion

Change-Id: Id06045fd638fa53eb5725eadd63cace148fc53f3
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/net/addr/subnet.cpp b/test/net/addr/subnet.cpp
index 561507c..5024928 100644
--- a/test/net/addr/subnet.cpp
+++ b/test/net/addr/subnet.cpp
@@ -51,6 +51,15 @@
     EXPECT_TRUE(Subnet4(addr4Full, 0).contains(In4Addr{}));
 }
 
+TEST(Subnet4, ToStr)
+{
+    ToStrHandle<ToStr<Subnet4>> tsh;
+    EXPECT_EQ("0.0.0.0/16", tsh(Subnet4({}, 16)));
+    EXPECT_EQ("255.0.255.255/28", tsh(Subnet4(In4Addr{255, 0, 255, 255}, 28)));
+    EXPECT_EQ("a 1.2.3.4/32 b",
+              fmt::format("a {} b", Subnet4(In4Addr{1, 2, 3, 4}, 32)));
+}
+
 TEST(Subnet6, Basic)
 {
     EXPECT_NO_THROW(Subnet6(in6_addr{0xff}, 128));
@@ -102,6 +111,15 @@
     EXPECT_TRUE(Subnet6(addr6Full, 0).contains(In6Addr{}));
 }
 
+TEST(Subnet6, ToStr)
+{
+    ToStrHandle<ToStr<Subnet6>> tsh;
+    EXPECT_EQ("::/0", tsh(Subnet6({}, 0)));
+    EXPECT_EQ("ff00::/128", tsh(Subnet6(In6Addr{0xff}, 128)));
+    EXPECT_EQ("a 102:304::/32 b",
+              fmt::format("a {} b", Subnet6(In6Addr{1, 2, 3, 4}, 32)));
+}
+
 TEST(SubnetAny, Basic)
 {
     EXPECT_NO_THROW(SubnetAny(in_addr{0xffffffff}, 32));
@@ -157,4 +175,15 @@
     EXPECT_FALSE(SubnetAny(addr4Full, 32).contains(InAnyAddr{In4Addr{}}));
 }
 
+TEST(SubnetAny, ToStr)
+{
+    ToStrHandle<ToStr<SubnetAny>> tsh;
+    EXPECT_EQ("0.0.0.0/16", tsh(SubnetAny(In4Addr{}, 16)));
+    EXPECT_EQ("ff00::/128", tsh(SubnetAny(In6Addr{0xff}, 128)));
+    EXPECT_EQ("a 102:304::/32 b",
+              fmt::format("a {} b", SubnetAny(In6Addr{1, 2, 3, 4}, 32)));
+    EXPECT_EQ("a 1.2.3.4/32 b",
+              fmt::format("a {} b", SubnetAny(In4Addr{1, 2, 3, 4}, 32)));
+}
+
 } // namespace stdplus