package ipaddr

import (
	"net"
	"testing"
)

func TestIsPrivateIP(t *testing.T) {
	tests := []struct {
		ip      string
		private bool
	}{
		// IPv4 private addresses
		{"10.0.0.1", true},    // private network address
		{"100.64.0.1", true},  // shared address space
		{"172.16.0.1", true},  // private network address
		{"192.168.0.1", true}, // private network address
		{"192.0.0.1", true},   // IANA address
		{"192.0.2.1", true},   // documentation address
		{"127.0.0.1", true},   // loopback address
		{"169.254.0.1", true}, // link local address

		// IPv4 public addresses
		{"1.2.3.4", false},

		// IPv6 private addresses
		{"::1", true},         // loopback address
		{"fe80::1", true},     // link local address
		{"fc00::1", true},     // unique local address
		{"fec0::1", true},     // site local address
		{"2001:db8::1", true}, // documentation address

		// IPv6 public addresses
		{"2004:db6::1", false},
	}

	for _, tt := range tests {
		t.Run(tt.ip, func(t *testing.T) {
			ip := net.ParseIP(tt.ip)
			if ip == nil {
				t.Fatalf("%s is not a valid ip address", tt.ip)
			}
			if got, want := isPrivate(ip), tt.private; got != want {
				t.Fatalf("got %v for %v want %v", got, ip, want)
			}
		})
	}
}
