#!/usr/bin/python3.5
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# TODO(INTK-247): switch to the standard shebang line when the mocking library
# is available.

import os
import sys
import unittest
from unittest.mock import patch, MagicMock

from sdk_common import Atom, AtomId, detect_category_violations


def _atom(name, category):
    return Atom({
        'id': {
            'domain': 'foo',
            'name': name,
        },
        'category': category,
        'gn-label': '//hello',
        'deps': [],
        'package-deps': [],
        'files': [],
        'tags': [],
    })


class SdkCommonTests(unittest.TestCase):

    def test_categories(self):
        atoms = [_atom('hello', 'internal'), _atom('world', 'public')]
        self.assertFalse(detect_category_violations('internal', atoms))

    def test_categories_failure(self):
        atoms = [_atom('hello', 'internal'), _atom('world', 'public')]
        self.assertTrue(detect_category_violations('partner', atoms))

    def test_category_name_bogus(self):
        atoms = [_atom('hello', 'foobarnotgood'), _atom('world', 'public')]
        self.assertRaises(Exception, detect_category_violations, 'partner', atoms)


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