import unittest

from digest.digest_tools import Digest, content_path, InvalidDigestException

class TestParseDigest(unittest.TestCase):
  def test_parse_good(self):
    examples = [
      ('tarsum.v123123+sha1:123deadbeef', ('tarsum.v123123+sha1', '123deadbeef')),
      ('tarsum.v1+sha256:123123', ('tarsum.v1+sha256', '123123')),
      ('tarsum.v0+md5:abc', ('tarsum.v0+md5', 'abc')),
      ('tarsum+sha1:abc', ('tarsum+sha1', 'abc')),
      ('sha1:123deadbeef', ('sha1', '123deadbeef')),
      ('sha256:123123', ('sha256', '123123')),
      ('md5:abc', ('md5', 'abc')),
    ]

    for digest, output_args in examples:
      self.assertEquals(Digest.parse_digest(digest), Digest(*output_args))

      # Test the string method
      self.assertEquals(str(Digest.parse_digest(digest)), digest)

  def test_parse_fail(self):
    examples = [
      'tarsum.v+md5:abc:',
      'sha1:123deadbeefzxczxv',
      'sha256123123',
      'tarsum.v1+',
      'tarsum.v1123+sha1:',
    ]

    for bad_digest in examples:
      with self.assertRaises(InvalidDigestException):
        Digest.parse_digest(bad_digest)


class TestDigestPath(unittest.TestCase):
  def test_paths(self):
    examples = [
      ('tarsum.v123123+sha1:123deadbeef', 'tarsum/v123123/sha1/12/123deadbeef'),
      ('tarsum.v1+sha256:123123', 'tarsum/v1/sha256/12/123123'),
      ('tarsum.v0+md5:abc', 'tarsum/v0/md5/ab/abc'),
      ('sha1:123deadbeef', 'sha1/12/123deadbeef'),
      ('sha256:123123', 'sha256/12/123123'),
      ('md5:abc', 'md5/ab/abc'),
      ('md5:1', 'md5/01/1'),
      ('md5.....+++:1', 'md5/01/1'),
      ('.md5.:1', 'md5/01/1'),
    ]

    for digest, path in examples:
      self.assertEquals(content_path(digest), path)


if __name__ == '__main__':
  unittest.main()