/+  *test, ring
::
=/  eny=@uvJ               `@`0xdead.beef
::
=/  hello-world            (shaz (jam "Hello World"))
=/  not-hello-world        (shaz (jam "Goodbye World"))
::
=/  empty-scope=(unit @)   ~
=/  test-scope=(unit @)    `(shaz (jam [%scope 5]))
=/  test-scope-2=(unit @)  `(shaz (jam [%scope 6]))
::
=/  our-privkey=@udscalar  3
=/  our-pubkey=@udpoint    (scalarmult-base:ed:crypto our-privkey)
::
=/  two-privkey=@udscalar  2
=/  two-pubkey=@udpoint    (scalarmult-base:ed:crypto two-privkey)
::
=/  public-key-set         (sy (turn (gulf 1 5) scalarmult-base:ed:crypto))
|%
++  test-basic-unlinked
  =/  unlinked
    %-  sign:raw:ring  :*
      hello-world
      empty-scope
      public-key-set
      our-pubkey
      our-privkey
      eny
    ==
  ::
  %+  expect-eq
    !>  %.y
    !>  (verify:raw:ring hello-world empty-scope public-key-set unlinked)
::
++  test-linked-different-message-same-key-same-scope
  =/  linked-hello-world
    %-  sign:raw:ring  :*
      hello-world
      test-scope
      public-key-set
      our-pubkey
      our-privkey
      eny
    ==
  ::
  =/  linked-not-hello-world
    %-  sign:raw:ring  :*
      not-hello-world
      test-scope
      public-key-set
      our-pubkey
      our-privkey
      eny
    ==
  ::
  ;:  weld
    %+  expect-eq
      !>  %.y
      !>  (verify:raw:ring hello-world test-scope public-key-set linked-hello-world)
  ::
    %+  expect-eq
      !>  %.y
      !>  (verify:raw:ring not-hello-world test-scope public-key-set linked-not-hello-world)
  ::
    (expect-eq !>(%.y) !>(?=(^ y.linked-hello-world)))
    (expect-eq !>(%.y) !>(?=(^ y.linked-not-hello-world)))
  ::
    %+  expect-eq
      !>  y.linked-hello-world
      !>  y.linked-not-hello-world
  ==
::  if we use the same key to sign the same message in two different scopes, we
::  must have different resulting linkage tags.
::
++  test-linked-same-message-same-key-different-scope
  =/  scope-one-hello-world
    %-  sign:raw:ring  :*
      hello-world
      test-scope
      public-key-set
      our-pubkey
      our-privkey
      eny
    ==
  ::
  =/  scope-two-hello-world
    %-  sign:raw:ring  :*
      hello-world
      test-scope-2
      public-key-set
      our-pubkey
      our-privkey
      eny
    ==
  ::
  ;:  weld
    %+  expect-eq
      !>  %.y
      !>  (verify:raw:ring hello-world test-scope public-key-set scope-one-hello-world)
  ::
    %+  expect-eq
      !>  %.y
      !>  (verify:raw:ring hello-world test-scope-2 public-key-set scope-two-hello-world)
  ::
    (expect-eq !>(%.y) !>(?=(^ y.scope-one-hello-world)))
    (expect-eq !>(%.y) !>(?=(^ y.scope-two-hello-world)))
  ::
    %+  expect-eq
      !>  %.n
      !>  =(y.scope-one-hello-world y.scope-two-hello-world)
  ==
::  the same message signed by two different keys should have different linkage
::
++  test-linked-same-message-different-key
  =/  our-hello-world
    %-  sign:raw:ring  :*
      hello-world
      test-scope
      public-key-set
      our-pubkey
      our-privkey
      eny
    ==
  ::
  =/  two-hello-world
    %-  sign:raw:ring  :*
      hello-world
      test-scope
      public-key-set
      two-pubkey
      two-privkey
      eny
    ==
  ::
  ;:  weld
    %+  expect-eq
      !>  %.y
      !>  (verify:raw:ring hello-world test-scope public-key-set our-hello-world)
  ::
    %+  expect-eq
      !>  %.y
      !>  (verify:raw:ring hello-world test-scope public-key-set two-hello-world)
  ::
    (expect-eq !>(%.y) !>(?=(^ y.our-hello-world)))
    (expect-eq !>(%.y) !>(?=(^ y.two-hello-world)))
  ::
    %+  expect-eq
      !>  %.n
      !>  =(y.our-hello-world y.two-hello-world)
  ==
--