diff --git a/lib/ipaddress/ipv4.rb b/lib/ipaddress/ipv4.rb index 94cc6069a82dd9d1545fda4d0524162fb1ff7e0f..500531aa9e215ccfacad3e26426c894c58b2ea95 100644 --- a/lib/ipaddress/ipv4.rb +++ b/lib/ipaddress/ipv4.rb @@ -309,7 +309,14 @@ module IPAddress; # #=> "172.16.10.255" # def broadcast - self.class.parse_u32(broadcast_u32, @prefix) + case + when prefix <= 30 + self.class.parse_u32(broadcast_u32, @prefix) + when prefix == 31 + self.class.parse_u32(-1, @prefix) + when prefix == 32 + return self + end end # @@ -363,7 +370,14 @@ module IPAddress; # #=> "192.168.100.1" # def first - self.class.parse_u32(network_u32+1, @prefix) + case + when prefix <= 30 + self.class.parse_u32(network_u32+1, @prefix) + when prefix == 31 + self.class.parse_u32(network_u32, @prefix) + when prefix == 32 + return self + end end # @@ -388,7 +402,14 @@ module IPAddress; # #=> "192.168.100.254" # def last - self.class.parse_u32(broadcast_u32-1, @prefix) + case + when prefix <= 30 + self.class.parse_u32(broadcast_u32-1, @prefix) + when prefix == 31 + self.class.parse_u32(broadcast_u32, @prefix) + when prefix == 32 + return self + end end # diff --git a/test/ipaddress/ipv4_test.rb b/test/ipaddress/ipv4_test.rb index 468089858c3b01be1417022630f9cddb647dded5..9f92c944150cc8962d1994365a440ac921d3baeb 100644 --- a/test/ipaddress/ipv4_test.rb +++ b/test/ipaddress/ipv4_test.rb @@ -26,7 +26,8 @@ class IPv4Test < Minitest::Test "10.0.0.0/8" => "255.0.0.0", "172.16.0.0/16" => "255.255.0.0", "192.168.0.0/24" => "255.255.255.0", - "192.168.100.4/30" => "255.255.255.252"} + "192.168.100.4/30" => "255.255.255.252", + "192.168.12.4/32" => "255.255.255.255"} @decimal_values ={ "0.0.0.0/0" => 0, @@ -48,13 +49,17 @@ class IPv4Test < Minitest::Test "10.0.0.0/8" => "10.255.255.255/8", "172.16.0.0/16" => "172.16.255.255/16", "192.168.0.0/24" => "192.168.0.255/24", - "192.168.100.4/30" => "192.168.100.7/30"} + "192.168.100.4/30" => "192.168.100.7/30", + "192.168.12.3/31" => "255.255.255.255/31", + "10.0.0.1/32" => "10.0.0.1/32"} @networks = { "10.5.4.3/8" => "10.0.0.0/8", "172.16.5.4/16" => "172.16.0.0/16", "192.168.4.3/24" => "192.168.4.0/24", - "192.168.100.5/30" => "192.168.100.4/30"} + "192.168.100.5/30" => "192.168.100.4/30", + "192.168.1.3/31" => "192.168.1.2/31", + "192.168.2.5/32" => "192.168.2.5/32"} @class_a = @klass.new("10.0.0.1/8") @class_b = @klass.new("172.16.0.1/16") @@ -194,6 +199,12 @@ class IPv4Test < Minitest::Test ip = @klass.new("192.168.100.50/24") assert_instance_of @klass, ip.first assert_equal "192.168.100.1", ip.first.to_s + ip = @klass.new("192.168.100.50/32") + assert_instance_of @klass, ip.first + assert_equal "192.168.100.50", ip.first.to_s + ip = @klass.new("192.168.100.50/31") + assert_instance_of @klass, ip.first + assert_equal "192.168.100.50", ip.first.to_s end def test_method_last @@ -203,6 +214,12 @@ class IPv4Test < Minitest::Test ip = @klass.new("192.168.100.50/24") assert_instance_of @klass, ip.last assert_equal "192.168.100.254", ip.last.to_s + ip = @klass.new("192.168.100.50/32") + assert_instance_of @klass, ip.last + assert_equal "192.168.100.50", ip.last.to_s + ip = @klass.new("192.168.100.50/31") + assert_instance_of @klass, ip.last + assert_equal "192.168.100.51", ip.last.to_s end def test_method_each_host