#!/bin/bash
# Test: Miscellaneous validators (MAC, integer, URL, negation, version comparison)
. "$(dirname "$0")/../lib/setup.sh"

oneTimeTearDown() { rm -rf "${MOCK_ROOT:-}"; }

testMacAddress() {
	assertTrue "Uppercase MAC" "is_mac_address 'AA:BB:CC:DD:EE:FF'"
	assertTrue "Lowercase MAC" "is_mac_address 'aa:bb:cc:dd:ee:ff'"
	assertTrue "Numeric MAC" "is_mac_address '00:11:22:33:44:55'"
	assertFalse "Too short" "is_mac_address 'AA:BB:CC:DD:EE'"
	assertFalse "Too long" "is_mac_address 'AA:BB:CC:DD:EE:FF:00'"
	assertFalse "Dash notation" "is_mac_address 'AA-BB-CC-DD-EE-FF'"
	assertFalse "Not a MAC" "is_mac_address 'not_a_mac'"
	assertFalse "Empty string" "is_mac_address ''"
}

testMacAddressBadNotation() {
	assertTrue "Dash notation" "is_mac_address_bad_notation 'AA-BB-CC-DD-EE-FF'"
	assertFalse "Colon notation" "is_mac_address_bad_notation 'AA:BB:CC:DD:EE:FF'"
}

testIsInteger() {
	assertTrue "Zero" "is_integer '0'"
	assertTrue "Positive" "is_integer '123'"
	assertTrue "Large number" "is_integer '999999'"
	assertFalse "Empty string" "is_integer ''"
	assertFalse "Letters" "is_integer 'abc'"
	assertFalse "Decimal" "is_integer '12.34'"
	assertFalse "Negative" "is_integer '-1'"
}

testIsNegated() {
	assertTrue "Negated IP" "is_negated '!192.168.1.1'"
	assertTrue "Negated domain" "is_negated '!example.com'"
	assertFalse "Not negated" "is_negated '192.168.1.1'"
	assertFalse "Empty string" "is_negated ''"
}

testUrlValidators() {
	assertTrue "HTTP URL" "is_url_http 'http://example.com'"
	assertTrue "HTTPS URL" "is_url_https 'https://example.com'"
	assertTrue "FTP URL" "is_url_ftp 'ftp://files.example.com'"
	assertTrue "File URL" "is_url_file 'file:///tmp/list.txt'"
	assertFalse "HTTPS is not HTTP" "is_url_http 'https://example.com'"
	assertFalse "HTTP is not HTTPS" "is_url_https 'http://example.com'"
	assertTrue "HTTP is URL" "is_url 'http://example.com'"
	assertTrue "HTTPS is URL" "is_url 'https://example.com'"
	assertTrue "FTP is URL" "is_url 'ftp://example.com'"
	assertTrue "File is URL" "is_url 'file:///tmp/x'"
	assertFalse "Plain domain not URL" "is_url 'example.com'"
}

testVersionComparison() {
	assertTrue "2.0 > 1.0" "is_greater '2.0' '1.0'"
	assertTrue "1.10 > 1.9" "is_greater '1.10' '1.9'"
	assertFalse "1.0 not > 2.0" "is_greater '1.0' '2.0'"
	assertFalse "Equal not greater" "is_greater '1.0' '1.0'"
	assertTrue "Equal is >=" "is_greater_or_equal '1.0' '1.0'"
	assertTrue "Greater is >=" "is_greater_or_equal '2.0' '1.0'"
	assertFalse "Lesser not >=" "is_greater_or_equal '1.0' '2.0'"
}

testFamilyMismatch() {
	assertTrue "IPv4 src IPv6 dst" "is_family_mismatch '192.168.1.1' '::1'"
	assertTrue "IPv6 src IPv4 dst" "is_family_mismatch '::1' '10.0.0.1'"
	assertFalse "Both IPv4" "is_family_mismatch '10.0.0.1' '10.0.0.2'"
	assertFalse "Both IPv6" "is_family_mismatch '::1' '::2'"
}

. shunit2
