#  Test use of external values with dynamic loading, using demo cfunc.

link cfunc

record complex(r, i)

procedure main()
   local e, l, v1, v2, v3, v4
   local r1,r2,r3,r4, s1, s2, s3, s4

   # test simple creation, type(), copy()
   xwrite("v1", v1 := extxmin())
   xwrite("v2", v2 := extxmin())
   xwrite("v3", v3 := v1)
   xwrite("v4", v4 := copy(v1))

   # test string-based external example
   xwrite("s1", s1 := extxstr("bite"))
   xwrite("s2", s2 := extxstr("the"))
   xwrite("s3", s3 := extxstr("wax"))
   xwrite("s4", s4 := extxstr("tadpole"))

   # test real-based external example
   xwrite("r1", r1 := extxreal(111.1))
   xwrite("r2", r2 := extxreal(222.2))
   xwrite("r3", r3 := extxreal(333.3))
   xwrite("r4", r4 := copy(r1))

   # test === and ~===
   teqv(v1, v3, v2)
   teqv(v1, v4, v2)
   teqv(s2, copy(s2), s3)
   teqv(r1, r1, copy(r1))
   teqv(s1, s1, s3)
   teqv(r2, r2, r4)
   teqv(s3, s3, r3)

   # test sorting
   l := [ v1, s2, r3, v4, s1, r2, complex(8,9), v3, s4, r1, v2, s3, r4 ]
   write()
   every xwrite("before", !l)
   write()
   every xwrite("sorted", !sort(l))

end


#  write label, type(xval), image(xval)

procedure xwrite(label, xval)
   write(label, ": ", type(xval), ": ",image(xval))
   return
end


#  test equivalence of id1 and id2, and nonequivalence of diff

procedure teqv(id1, id2, diff)
   if id1 ~=== id2 then
      write("nonequivalent: ", image(id1), " and ", image(id2))
   if id2 ~=== id1 then
      write("nonequivalent: ", image(id2), " and ", image(id1))
   if not (id1 === id2) then
      write("not equivalent: ", image(id1), " and ", image(id2))

   if id1 === diff then
      write("false equivalence: ", image(id1), " and ", image(diff))
   if id2 === diff then
      write("false equivalence: ", image(id2), " and ", image(diff))
   return
end
