note
	description: "Summary description for {TEST_REL}."
	author: "Jackie Wang"
	date: "$Date$"
	revision: "$Revision$"

class 
	TEST_REL

inherit
	ES_TEST
		redefine
			setup
		end

	COMMON_SETUP
		undefine
			default_create
		end

create 
	make

feature {NONE} -- Initialization

	make
			-- Run application.
		do
			setup
			add_boolean_case (agent t1)
			add_boolean_case (agent t2)
			add_boolean_case (agent t3)
			add_boolean_case (agent t4)
			add_boolean_case (agent t5)
			add_boolean_case (agent t6)
			add_boolean_case (agent t7)
			add_boolean_case (agent t8)
			add_boolean_case (agent t9)
		end

	setup
			-- Will be executed at the beginning of "run" in a test case.
		do
			common_setup
		end
	
feature -- tests

	t1: BOOLEAN
		local
			r, r1: REL [PERSON, CAR]
			r_inv: REL [CAR, PERSON]
			img, s: SET [CAR]
		do
			comment ("t1: basic relational operations")
			create r.make_empty
			Result := # r = 0
			check
					Result
			end
			r.extend (create {PAIR [PERSON, CAR]}.make_from_tuple ([p1, m1]))
			r.extend (create {PAIR [PERSON, CAR]}.make_from_tuple ([p1, m2]))
			r.union (create {REL [PERSON, CAR]}.make_from_tuple_array (<<[p1, m3], [p1, m4]>>))
			create r1.make_from_tuple_array (<<[p1, m3], [p1, m4], [p1, m1]>>)
			Result := r /~ r1 and then r1 |<: r and then not (r |<: r1)
			check
					Result
			end
			r1 := r1.extended (create {PAIR [PERSON, CAR]}.make_from_tuple ([p1, m2]))
			Result := r ~ r1 and then r1 |<: r and then r |<: r1
			check
					Result
			end
			create s.make_from_array (<<m2, m1, m3, m4>>)
			img := r1.image (p1)
			Result := img ~ s
			check
					Result
			end
			r_inv := r.inverse
			Result := r_inv ~ create {REL [CAR, PERSON]}.make_from_tuple_array (<<[m4, p1], [m2, p1], [m1, p1], [m3, p1]>>)
			check
					Result
			end
			Result := r_inv.inverse ~ r
			check
					Result
			end
		end

	t2: BOOLEAN
		local
			er, r, r1, r2: REL [PERSON, CAR]
			es, s1, s2, s12, s3, s123: SET [PERSON]
		do
			comment ("t2: domain restriction and subtraction")
			create s1.make_from_array (<<p1>>)
			create s2.make_from_array (<<p2>>)
			create s12.make_from_array (<<p1, p2>>)
			create s3.make_from_array (<<p3>>)
			create s123.make_from_array (<<p1, p2, p3>>)
			create r1.make_from_tuple_array (<<[p1, m1], [p1, m4]>>)
			create r2.make_from_tuple_array (<<[p2, m3], [p2, m2]>>)
			r := r1.unioned (r2)
			Result := r |< s1 ~ r1 and then r |<< s1 ~ r2 and then ((r |< s1) |\/| (r |<< s1)) ~ r
			check
					Result
			end
			Result := r |< s2 ~ r2 and then r |<< s2 ~ r1 and then ((r |< s2) |\/| (r |<< s2)) ~ r
			check
					Result
			end
			create er.make_empty
			Result := r |< s12 ~ r and then r |<< s12 ~ er and then ((r |< s12) |\/| (r |<< s12)) ~ r
			check
					Result
			end
			Result := r |< s3 ~ er and then r |<< s3 ~ r and then ((r |< s3) |\/| (r |<< s3)) ~ r
			check
					Result
			end
			Result := r |< s123 ~ r and then r |<< s123 ~ er and then ((r |< s123) |\/| (r |<< s123)) ~ r
			check
					Result
			end
			create es.make_empty
			Result := r |< es ~ er and then r |<< es ~ r and then ((r |< es) |\/| (r |<< es)) ~ r
			check
					Result
			end
		end

	t3: BOOLEAN
		local
			er, r, r1, r2: REL [PERSON, CAR]
			es, s1, s2, s12, s3, s123: SET [CAR]
		do
			comment ("t3: range restriction and subtraction")
			create s1.make_from_array (<<m1>>)
			create s2.make_from_array (<<m2>>)
			create s12.make_from_array (<<m1, m2>>)
			create s3.make_from_array (<<m3>>)
			create s123.make_from_array (<<m1, m2, m3>>)
			create r1.make_from_tuple_array (<<[p1, m1], [p4, m1]>>)
			create r2.make_from_tuple_array (<<[p3, m2], [p2, m2]>>)
			r := r1.unioned (r2)
			Result := r |> s1 ~ r1 and then r |>> s1 ~ r2 and then ((r |> s1) |\/| (r |>> s1)) ~ r
			check
					Result
			end
			Result := r |> s2 ~ r2 and then r |>> s2 ~ r1 and then ((r |> s2) |\/| (r |>> s2)) ~ r
			check
					Result
			end
			create er.make_empty
			Result := r |> s12 ~ r and then r |>> s12 ~ er and then ((r |> s12) |\/| (r |>> s12)) ~ r
			check
					Result
			end
			Result := r |> s3 ~ er and then r |>> s3 ~ r and then ((r |> s3) |\/| (r |>> s3)) ~ r
			check
					Result
			end
			Result := r |> s123 ~ r and then r |>> s123 ~ er and then ((r |> s123) |\/| (r |>> s123)) ~ r
			check
					Result
			end
			create es.make_empty
			Result := r |> es ~ er and then r |>> es ~ r and then ((r |> es) |\/| (r |>> es)) ~ r
			check
					Result
			end
		end

	t4: BOOLEAN
		local
			rel, fun, inj: REL [PERSON, CAR]
		do
			comment ("t4: is_function and is_injection")
			create rel.make_from_tuple_array (<<[p1, m1], [p2, m2], [p3, m3], [p1, m4]>>)
			Result := not (rel.is_function or rel.is_injection)
			check
					Result
			end
			create fun.make_from_tuple_array (<<[p1, m1], [p2, m2], [p3, m3], [p4, m1]>>)
			Result := fun.is_function and not fun.is_injection
			check
					Result
			end
			create inj.make_from_tuple_array (<<[p1, m1], [p2, m2], [p3, m3], [p4, m4]>>)
			Result := inj.is_function and inj.is_injection
			check
					Result
			end
		end

	t5: BOOLEAN
		local
			er, r1, r2, r3, r4, r5, r6, r7: REL [PERSON, CAR]
			s: SET [PERSON]
		do
			comment ("t5: relationl override")
			create er.make_empty
			create r1.make_from_tuple_array (<<[p1, m1], [p2, m2], [p3, m3]>>)
			Result := er |<+ r1 ~ r1 and r1 |<+ er ~ r1 and er |<+ er ~ er
			check
					Result
			end
			create r2.make_from_tuple_array (<<[p1, m2], [p2, m3], [p2, m4]>>)
			create s.make_from_array (<<p1, p2>>)
			r3 := r1.domain_subtracted (s).unioned (r2)
			r4 := r1.domain_restricted (r1.domain |\ s).unioned (r2)
			Result := r1 |<+ r2 ~ r3 and r1 |<+ r2 ~ r4
			check
					Result
			end
			create r5.make_from_tuple_array (<<[p4, m4], [p4, m1]>>)
			create s.make_from_array (<<p4>>)
			r6 := r1.domain_subtracted (s).unioned (r5)
			r7 := r1.domain_restricted (r1.domain |\ s).unioned (r5)
			Result := r1 |<+ r5 ~ r6 and r1 |<+ r5 ~ r7
			check
					Result
			end
		end

	t6: BOOLEAN
		local
			r, r1, r2: REL [PERSON, CAR]
		do
			comment ("t6: relation comprehension")
			create r.make_from_tuple_array (<<[p1, m1], [p2, m2], [p3, m3], [p1, m4], [p4, m4]>>)
			r1 := r.domain_restricted (create {SET [PERSON]}.make_from_array (<<p1>>))
			r2 := r.comprehension (agent is_person (?, p1))
			Result := r1 ~ r2
			check
					Result
			end
		end

	t7: BOOLEAN
		local
			r, r_: REL [PERSON, CAR]
		do
			comment ("t7: item and remove")
			create r.make_from_tuple_array (<<[p1, m1], [p2, m2], [p3, m3]>>)
			r.choose_item
			Result := r.item.first ~ p3 and r.item.second ~ m3
			check
					Result
			end
			r.remove_item
			r.choose_item
			create r_.make_from_tuple_array (<<[p1, m1], [p2, m2]>>)
			Result := r ~ r_ and then r.item.first ~ p2 and r.item.second ~ m2
			check
					Result
			end
			r.extend (create {PAIR [PERSON, CAR]}.make_from_tuple ([p4, m4]))
			r.choose_item
			create r_.make_from_tuple_array (<<[p4, m4], [p1, m1], [p2, m2]>>)
			Result := r ~ r_ and then r.item.first ~ p4 and r.item.second ~ m4
			check
					Result
			end
			r.subtract (create {PAIR [PERSON, CAR]}.make_from_tuple ([p2, m2]))
			r.choose_item
			create r_.make_from_tuple_array (<<[p4, m4], [p1, m1]>>)
			Result := r ~ r_ and then r.item.first ~ p4 and r.item.second ~ m4
			check
					Result
			end
		end

	t8: BOOLEAN
		local
			r, r1, r2, r3: REL [PERSON, CAR]
			s1, s2, s12, s3, s123: SET [PERSON]
			ap: ARRAY [TUPLE [PERSON, CAR]]
		do
			comment ("t8: relation as tupled array")
			create s1.make_from_array (<<p1>>)
			create s2.make_from_array (<<p2>>)
			create s12.make_from_array (<<p1, p2>>)
			create s3.make_from_array (<<p3>>)
			create s123.make_from_array (<<p1, p2, p3>>)
			r1 := create {attached REL [PERSON, CAR]}.make_from_tuple_array (<<[p1, m1], [p1, m4]>>)
			r2 := create {attached REL [PERSON, CAR]}.make_from_tuple_array (<<[p2, m3], [p2, m2]>>)
			r := r1.unioned (r2)
			Result := r |< s1 ~ r1 and then r |<< s1 ~ r2 and then ((r |< s1) |\/| (r |<< s1)) ~ r
			check
					Result
			end
			create r3.make_from_tuple_array (<<[p1, m1], [p1, m4]>>)
			ap := <<[p1, m1], [p1, m4]>>
			ap.compare_objects
			ap.do_all (agent {TUPLE [PERSON, CAR]}.compare_objects)
			Result := r1.as_array ~ ap
			check
					Result
			end
		end

	t9: BOOLEAN
		local
			r: REL [PERSON, CAR]
			sc: SET [CAR]
		do
			comment ("t8: test image as a set")
			r := create {attached REL [PERSON, CAR]}.make_from_tuple_array (<<[p1, m1], [p1, m4], [p2, m3]>>)
			sc := create {attached SET [CAR]}.make_from_array (<<m1, m4>>)
			Result := r [p1] ~ sc
			check
					Result
			end
		end
	
end -- class TEST_REL

Generated by ISE EiffelStudio