#!/usr/bin/env python
# Copyright 2013, Big Switch Networks, Inc.
#
# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
# the following special exception:
#
# LOXI Exception
#
# As a special exception to the terms of the EPL, you may distribute libraries
# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
# that copyright and licensing notices generated by LoxiGen are not altered or removed
# from the LoxiGen Libraries and the notice provided below is (i) included in
# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
# documentation for the LoxiGen Libraries, if distributed in binary form.
#
# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
#
# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
# a copy of the EPL at:
#
# http://www.eclipse.org/legal/epl-v10.html
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# EPL for the specific language governing permissions and limitations
# under the EPL.

import sys
import os
import unittest

root_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..')
sys.path.insert(0, root_dir)

from generic_utils import *

class MyHash(object):
    def __init__(self, val):
        self.val = val

    def __hash__(self):
        return hash(self.val)

    def __str__(self):
        return "BoringConstantString"

    def __eq__(self, o ):
        return type(self) == type(o) and self.val == o.val

class GenericTest(unittest.TestCase):
    def test_memoize_simple(self):
        self.count = 0

        @memoize
        def function():
            self.count += 1
            return "Foo"

        self.assertEquals(0, self.count)
        self.assertEquals("Foo", function())
        self.assertEquals(1, self.count)
        self.assertEquals("Foo", function())
        self.assertEquals(1, self.count)

    def test_memoize_string_args(self):
        self.count = 0

        @memoize
        def function(a, b):
            self.count += 1
            return "%s:%s" % (a,b)

        self.assertEquals(0, self.count)
        self.assertEquals("a:b", function('a', 'b'))
        self.assertEquals(1, self.count)
        self.assertEquals("ab:", function('ab', ''))
        self.assertEquals(2, self.count)
        self.assertEquals("ab:", function('ab', ''))
        self.assertEquals(2, self.count)

    def test_memoize_kw_args(self):
        self.count = 0

        @memoize
        def function(**kw):
            self.count += 1
            return ",".join("{k}={v}".format(k=k,v=v) for k,v in kw.items())

        self.assertEquals(0, self.count)
        self.assertEquals("a=1", function(a=1))
        self.assertEquals(1, self.count)
        self.assertEquals("a=1,b=2", function(a=1, b=2))
        self.assertEquals(2, self.count)
        self.assertEquals("a=1", function(a=1))
        self.assertEquals(2, self.count)
        self.assertEquals("a=1,b=BoringConstantString", function(a=1, b=MyHash('1')))
        self.assertEquals(3, self.count)

    def test_memoize_with_hashable_object(self):
        self.count = 0

        @memoize
        def function(a):
            self.count += 1
            return a.val

        self.assertEquals(0, self.count)
        self.assertEquals("a", function(MyHash('a')))
        self.assertEquals(1, self.count)
        self.assertEquals("b", function(MyHash('b')))
        self.assertEquals(2, self.count)
        self.assertEquals("a", function(MyHash('a')))
        self.assertEquals(2, self.count)

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