# Path: distributions/tests/util.py
# def assert_all_close(collection, **kwargs):
#     for i1, item1 in enumerate(collection[:-1]):
#         for item2 in collection[i1 + 1:]:
#             assert_close(item1, item2, **kwargs)
# 
# def list_models():
#     result = set()
#     for path in glob.glob(os.path.join(ROOT, '*', 'models', '*.p*')):
#         dirname, filename = os.path.split(path)
#         flavor = os.path.split(os.path.dirname(dirname))[-1]
#         name = os.path.splitext(filename)[0]
#         if not name.startswith('__'):
#             result.add((name, flavor))
#     for name, flavor in sorted(result):
#         spec = {'flavor': flavor, 'name': name}
#         if name.startswith('_'):
#             continue
#         try:
#             import_model(spec)
#             yield spec
#         except ImportError:
#             module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#             print 'failed to import {}'.format(module_name)
#             import traceback
#             print traceback.format_exc()
# 
# def import_model(spec):
#     module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#     return importlib.import_module(module_name)


from distributions.tests.util import (
    assert_all_close,
    list_models,
    import_model,
)
# - Neither the name of Salesforce.com nor the names of its contributors
#   may be used to endorse or promote products derived from this
#   software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



MODULES = {}
for spec in list_models():
    MODULES.setdefault(spec['name'], []).append(import_model(spec))


def test_model():
    for name in MODULES:
        yield _test_model, name


def _test_model(name):
    modules = MODULES[name]

# Path: distributions/tests/util.py
# def assert_all_close(collection, **kwargs):
#     for i1, item1 in enumerate(collection[:-1]):
#         for item2 in collection[i1 + 1:]:
#             assert_close(item1, item2, **kwargs)
# 
# def list_models():
#     result = set()
#     for path in glob.glob(os.path.join(ROOT, '*', 'models', '*.p*')):
#         dirname, filename = os.path.split(path)
#         flavor = os.path.split(os.path.dirname(dirname))[-1]
#         name = os.path.splitext(filename)[0]
#         if not name.startswith('__'):
#             result.add((name, flavor))
#     for name, flavor in sorted(result):
#         spec = {'flavor': flavor, 'name': name}
#         if name.startswith('_'):
#             continue
#         try:
#             import_model(spec)
#             yield spec
#         except ImportError:
#             module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#             print 'failed to import {}'.format(module_name)
#             import traceback
#             print traceback.format_exc()
# 
# def import_model(spec):
#     module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#     return importlib.import_module(module_name)


# Path: distributions/tests/test_model_flavors.py
from distributions.tests.util import (
    assert_all_close,
    list_models,
    import_model,
)

# - Neither the name of Salesforce.com nor the names of its contributors
#   may be used to endorse or promote products derived from this
#   software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



MODULES = {}
for spec in list_models():
    MODULES.setdefault(spec['name'], []).append(import_model(spec))


def test_model():
    for name in MODULES:
        yield _test_model, name


def _test_model(name):
    modules = MODULES[name]

    assert_all_close([m.NAME for m in modules], err_msg='Model.__name__')