Describe gina#core#meta
  Before
    %bwipeout!
  End

  After all
    %bwipeout!
  End

  Describe #get()
    It returns a default value when {name} does not exist
      Assert Equals(gina#core#meta#get('foo'), '')
      Assert Equals(gina#core#meta#get('foo', 0), 0)
    End

    It returns a {value} of {name} when exists
      call gina#core#meta#set('foo', 'bar')
      Assert Equals(gina#core#meta#get('foo'), 'bar')
    End
  End

  Describe #set()
    It sets a {value} with {name}
      call gina#core#meta#set('foo', 'bar')
      Assert Equals(gina#core#meta#get('foo'), 'bar')
    End
  End

  Describe #has()
    It returns 0 when {name} does not exist
      Assert Equals(gina#core#meta#has('foo'), 0)
    End

    It returns 1 when {name} exists
      call gina#core#meta#set('foo', 'bar')
      Assert Equals(gina#core#meta#has('foo'), 1)
    End
  End

  Describe #remove()
    It does nothing when {name} does not exist
      call gina#core#meta#set('foo', 'foo')
      call gina#core#meta#remove('bar')
      Assert Equals(gina#core#meta#get('foo'), 'foo')
      Assert Equals(gina#core#meta#get('bar'), '')
    End

    It removes {name} when exists
      call gina#core#meta#set('foo', 'foo')
      call gina#core#meta#set('bar', 'bar')
      call gina#core#meta#remove('bar')
      Assert Equals(gina#core#meta#get('foo'), 'foo')
      Assert Equals(gina#core#meta#get('bar'), '')
    End
  End

  Describe #clear()
    It does nothing when no entry exist
      call gina#core#meta#clear()
      Assert Equals(gina#core#meta#get('foo'), '')
      Assert Equals(gina#core#meta#get('bar'), '')
    End

    It removes all entries
      call gina#core#meta#set('foo', 'foo')
      call gina#core#meta#set('bar', 'bar')
      call gina#core#meta#clear()
      Assert Equals(gina#core#meta#get('foo'), '')
      Assert Equals(gina#core#meta#get('bar'), '')
    End
  End

  Describe #get_or_fail()
    It returns a {value} of {name} when {name} exist
      call gina#core#meta#set('foo', 'bar')
      Assert Equals(gina#core#meta#get_or_fail('foo'), 'bar')
    End

    It throws an exception when {name} does not exist
      Throws /A required meta value/ gina#core#meta#get_or_fail('foo')
    End
  End
End