#
# PRE: update update-remove-value update-remove-index update-tag
#
#  Remove all attributes in a list
#
update {
	control:Cleartext-Password := 'hello'
	reply:Filter-Id := 'filter'
}

update {
	request:Tunnel-Server-Endpoint += '192.0.1.1'
	request:Tunnel-Server-Endpoint += '192.0.1.2'
	request:Tunnel-Server-Endpoint:1 += '192.0.1.1'
	request:Tunnel-Server-Endpoint:2 += '192.0.2.1'
	request:Tunnel-Server-Endpoint:2 += '192.0.2.2'
	request:Tunnel-Server-Endpoint:3 += '192.0.3.1'
	request:Tunnel-Server-Endpoint:3 += '192.0.3.2'
	request:Tunnel-Server-Endpoint:3 += '192.0.3.3'
	control: += request:
}

# Check [#] is working correctly (should probably be another set of tests)
if (("%{request:Tunnel-Server-Endpoint[#]}" != 8) || \
    ("%{request:Tunnel-Server-Endpoint:0[#]}" != 2) || \
    ("%{request:Tunnel-Server-Endpoint:1[#]}" != 1) || \
    ("%{request:Tunnel-Server-Endpoint:2[#]}" != 2) || \
    ("%{request:Tunnel-Server-Endpoint:3[#]}" != 3)) {
	update reply {
		Filter-Id += 'fail 0'
	}
}

update {
	Tunnel-Server-Endpoint !* ANY
}

# List should now be empty
if ("%{request:Tunnel-Server-Endpoint[#]}" != 0) {
	update reply {
		Filter-Id += 'fail 1'
	}
}

# Reset the list
update {
	request: += control:
}

# Now remove all Tunnel-Server-Endpoint attributes with :2
update {
	Tunnel-Server-Endpoint:2 !* ANY
}

if (("%{request:Tunnel-Server-Endpoint[#]}" != 6) || \
    ("%{request:Tunnel-Server-Endpoint:0[#]}" != 2) || \
    ("%{request:Tunnel-Server-Endpoint:1[#]}" != 1) || \
    ("%{request:Tunnel-Server-Endpoint:2[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:3[#]}" != 3)) {
	update reply {
		Filter-Id += 'fail 2'
	}
}

# Now remove all Tunnel-Server-Endpoint attributes with :0 (no tags)
update {
	Tunnel-Server-Endpoint:0 !* ANY
}

if (("%{request:Tunnel-Server-Endpoint[#]}" != 4) || \
    ("%{request:Tunnel-Server-Endpoint:0[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:1[#]}" != 1) || \
    ("%{request:Tunnel-Server-Endpoint:2[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:3[#]}" != 3)) {
	update reply {
		Filter-Id += 'fail 3'
	}
}

# Now remove all Tunnel-Server-Endpoint attributes with :3
update {
	Tunnel-Server-Endpoint:3 !* ANY
}

if (("%{request:Tunnel-Server-Endpoint[#]}" != 1) || \
    ("%{request:Tunnel-Server-Endpoint:0[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:1[#]}" != 1) || \
    ("%{request:Tunnel-Server-Endpoint:2[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:3[#]}" != 0)) {
	update reply {
		Filter-Id += 'fail 4'
	}
}

# Now remove all Tunnel-Server-Endpoint attributes with :1
update {
	Tunnel-Server-Endpoint:1 !* ANY
}

if (("%{request:Tunnel-Server-Endpoint[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:0[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:1[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:2[#]}" != 0) || \
    ("%{request:Tunnel-Server-Endpoint:3[#]}" != 0)) {
	update reply {
		Filter-Id += 'fail 5'
	}
}

# Reset the list
update {
	request: += control:
}

# Remove all Tunnel-Server-Endpoint attributes at :3[0] (none)
update {
	Tunnel-Server-Endpoint:1[3] !* ANY
}

if (Tunnel-Server-Endpoint:3[0] != '192.0.3.1') {
	update reply {
		Filter-Id += 'fail 6'
	}
}

if (Tunnel-Server-Endpoint:3[1] != '192.0.3.2') {
	update reply {
		Filter-Id += 'fail 7'
	}
}

if (Tunnel-Server-Endpoint:3[2] != '192.0.3.3') {
	update reply {
		Filter-Id += 'fail 8'
	}
}

# Remove all Tunnel-Server-Endpoint attributes at :3[1]
update {
	Tunnel-Server-Endpoint:3[1] !* ANY
}

if (Tunnel-Server-Endpoint:3[0] != '192.0.3.1') {
	update reply {
		Filter-Id += 'fail 9'
	}
}

if (Tunnel-Server-Endpoint:3[1] != '192.0.3.3') {
	update reply {
		Filter-Id += 'fail 10'
	}
}

# Remove any Tunnel-Server-Endpoint with a value of '192.0.1.1' (should remove both tagged and untagged versions)
update {
	Tunnel-Server-Endpoint -= '192.0.1.1'
}

# Also checks whether presence checks for tagged attributes work correctly
if (request:Tunnel-Server-Endpoint:1) {
	update reply {
		Filter-Id += 'fail 11'
	}
}

if (request:Tunnel-Server-Endpoint:0[0] != '192.0.1.2') {
	update reply {
		Filter-Id += 'fail 12'
	}
}

# Remove any Tunnel-Server-Endpoint with a value of '192.0.3.1'
update {
	Tunnel-Server-Endpoint:3 -= '192.0.3.2'
}

if (request:Tunnel-Server-Endpoint:3[0] != '192.0.3.1') {
	update reply {
		Filter-Id += 'fail 13'
	}
}

if (request:Tunnel-Server-Endpoint:3[1] != '192.0.3.3') {
	update reply {
		Filter-Id += 'fail 14'
	}
}

# Reset the list
update {
	request: !* ANY
}
update {
	request: += control:
}

# Remove only the tagged version of '192.0.1.1'
update {
	request:Tunnel-Server-Endpoint:1 -= '192.0.1.1'
}

if (request:Tunnel-Server-Endpoint:0[0] != '192.0.1.1') {
	update reply {
		Filter-Id += 'fail 15'
	}
}

# Reset the list
update {
	request: !* ANY
}
update {
	request: += control:
}

# Remove only the untagged version of '192.0.1.1'
update {
	request:Tunnel-Server-Endpoint:0 -= '192.0.1.1'
}

if (request:Tunnel-Server-Endpoint:1[0] != '192.0.1.1') {
	update reply {
		Filter-Id += 'fail 16'
	}
}

# Remove the value of Tunnel-Server-Endpoint:3 at index 1 only if it matches '192.0.3.3' (which it does)
update {
	Tunnel-Server-Endpoint:3[1] -= '192.0.3.2'
}

if (Tunnel-Server-Endpoint:3[0] != '192.0.3.1') {
	update reply {
		Filter-Id += 'fail 17'
	}
}

if (Tunnel-Server-Endpoint:3[1] != '192.0.3.3') {
	update reply {
		Filter-Id += 'fail 18'
	}
}

# Reset the list
update {
	request: !* ANY
}
update {
	request: += control:
}

# Remove the value of Tunnel-Server-Endpoint:3 at index 1 only if it matches '192.0.3.4' (which it doesn't)
update {
	Tunnel-Server-Endpoint:3[1] -= '192.0.3.4'
}

if (Tunnel-Server-Endpoint:3[0] != '192.0.3.1') {
	update reply {
		Filter-Id += 'fail 19'
	}
}

if (Tunnel-Server-Endpoint:3[1] != '192.0.3.2') {
	update reply {
		Filter-Id += 'fail 20'
	}
}

if (Tunnel-Server-Endpoint:3[2] != '192.0.3.3') {
	update reply {
		Filter-Id += 'fail 21'
	}
}

