# -*- coding: utf8 -*-

from unittest import TestCase

from IPython.utils.py3compat import string_types, iteritems

from . import formattest

from .. import nbpy
from .nbexamples import nb0, nb0_py


class TestPy(formattest.NBFormatTest, TestCase):

    nb0_ref = nb0_py
    ext = 'py'
    mod = nbpy
    ignored_keys = ['collapsed', 'outputs', 'prompt_number', 'metadata']

    def assertSubset(self, da, db):
        """assert that da is a subset of db, ignoring self.ignored_keys.
        
        Called recursively on containers, ultimately comparing individual
        elements.
        """
        if isinstance(da, dict):
            for k,v in iteritems(da):
                if k in self.ignored_keys:
                    continue
                self.assertTrue(k in db)
                self.assertSubset(v, db[k])
        elif isinstance(da, list):
            for a,b in zip(da, db):
                self.assertSubset(a,b)
        else:
            if isinstance(da, string_types) and isinstance(db, string_types):
                # pyfile is not sensitive to preserving leading/trailing
                # newlines in blocks through roundtrip
                da = da.strip('\n')
                db = db.strip('\n')
            self.assertEqual(da, db)
        return True
    
    def assertNBEquals(self, nba, nbb):
        # since roundtrip is lossy, only compare keys that are preserved
        # assumes nba is read from my file format
        return self.assertSubset(nba, nbb)
        
