class Test_PubPackage(unittest.TestCase):
    def setUp(self):
        self.d = TemporaryDirectory()
        fname = os.path.join(self.d.name, 'pubspec.yaml')
        with open(fname, 'wt') as f:
            f.write(VALID_PUBSPEC_CONTENT)
        self.pubspec = PubspecFile.from_path(fname)
        self.pub_package = PubPackage(self.pubspec)

    def tearDown(self):
        self.d.cleanup()

    def testInitCanFail(self):
        p = PubPackage.from_path('???')
        self.assertEqual(p, None)

    def testInitCanSucceed(self):
        p = PubPackage.from_path(self.d.name)
        self.assertEqual(self.d.name, p.pubspec.parent)

    def testCanMakeTopLevelDir(self):
        self.assertFalse(os.path.exists(os.path.join(self.d.name, 'web')))
        self.pub_package.make_top_level_dir('web')
        self.assertTrue(os.path.exists(os.path.join(self.d.name, 'web')))

    def test_is_prefix_RaisesExceptionIfPrefixIsNone(self):
        self.assertRaises(AssertionError, self.pub_package.is_prefix, None, 'bar')

    def test_is_prefix_RaisesExceptionIfPathIsNone(self):
        self.assertRaises(AssertionError, self.pub_package.is_prefix, 'foo', None)

    def test_is_prefix_RaisesExceptionIfPathAndPrefixAreNone(self):
        self.assertRaises(AssertionError, self.pub_package.is_prefix, None, None)

    def test_is_prefix_ReturnsFalseIfPathIsNotPrefixed(self):
        self.assertFalse(self.pub_package.is_prefix('foo', 'bar'))

    def test_is_prefix_ReturnsTrueIfPathIsPrefixed(self):
        # TODO(guillermooo): Perhaps this should return false; we probably want to know
        # whether 'path' is a subdir of 'prefix', not just a suffix.
        self.assertTrue(self.pub_package.is_prefix('foo', 'foobar'))

    def test_is_prefix_ReturnsTrueIfPathIsSubdirOfPrefix(self):
        # TODO(guillermooo): Perhaps this should return false; we probably want to know
        # whether 'path' is a subdir of 'prefix', not just a suffix.
        prefix = os.path.join('foo', 'bar')
        path = os.path.join('foo', 'bar', 'baz')
        self.assertTrue(self.pub_package.is_prefix(prefix, path))

    def test__get_top_level_dir_ReturnsNoneIfPathDoesNotExist(self):
        self.assertEqual(self.pub_package._get_top_level_dir('web'), None)

    def test__get_top_level_dir_CanSucceed(self):
        self.pub_package.make_top_level_dir('web')
        self.assertTrue(os.path.exists(os.path.join(self.pub_package.pubspec.parent, 'web')))

    def testKnowsAboutWellKnownPaths(self):
        self.pub_package.make_top_level_dir('web')
        self.pub_package.make_top_level_dir('bin')
        self.pub_package.make_top_level_dir('test')
        self.pub_package.make_top_level_dir('tool')
        self.pub_package.make_top_level_dir('benchmark')
        self.pub_package.make_top_level_dir('doc')
        self.pub_package.make_top_level_dir('example')
        self.pub_package.make_top_level_dir('lib')

        self.assertTrue(os.path.exists(self.pub_package.path_to_web))
        self.assertTrue(os.path.exists(self.pub_package.path_to_bin))
        self.assertTrue(os.path.exists(self.pub_package.path_to_test))
        self.assertTrue(os.path.exists(self.pub_package.path_to_tool))
        self.assertTrue(os.path.exists(self.pub_package.path_to_benchmark))
        self.assertTrue(os.path.exists(self.pub_package.path_to_doc))
        self.assertTrue(os.path.exists(self.pub_package.path_to_example))
        self.assertTrue(os.path.exists(self.pub_package.path_to_lib))