# -*- coding:utf-8 -*-
#
# Copyright 2014 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# 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
# License for the specific language governing permissions and limitations
# under the License.

import os
import ast

import unittest
from bandit.core import node_visitor


class StatementBufferTests(unittest.TestCase):

    def setUp(self):
        super(StatementBufferTests, self).setUp()
        self.test_file = open("./examples/jinja2_templating.py")
        self.buf = node_visitor.StatementBuffer()
        self.buf.load_buffer(self.test_file)

    def tearDown(self):
        pass

    def test_load_buffer(self):
        # Check buffer contains 10 statements
        self.assertEqual(10, len(self.buf._buffer))

    def test_get_next(self):
        # Check get_next returns an AST statement
        stmt = self.buf.get_next()
        self.assertTrue(isinstance(stmt['node'], ast.AST))
        # Check get_next returned the first statement
        self.assertEqual(1, stmt['linerange'][0])
        # Check buffer has been reduced by one
        self.assertEqual(9, len(self.buf._buffer))

    def test_get_next_lookahead(self):
        # Check get_next(pop=False) returns an AST statement
        stmt = self.buf.get_next(pop=False)
        self.assertTrue(isinstance(stmt['node'], ast.AST))
        # Check get_next(pop=False) returned the first statement
        self.assertEqual(1, stmt['linerange'][0])
        # Check buffer remains the same length
        self.assertEqual(10, len(self.buf._buffer))

    def test_get_next_count(self):
        # Check get_next returns exactly 10 statements
        count = 0
        stmt = self.buf.get_next()
        while stmt is not None:
            count = count + 1
            stmt = self.buf.get_next()

        self.assertEqual(10, count)

    def test_get_next_empty(self):
        # Check get_next on an empty buffer returns None
        # self.test_file has already been read, so is empty file handle
        self.buf.load_buffer(self.test_file)
        stmt = self.buf.get_next()
        self.assertEqual(None, stmt)

    def test_linenumber_range(self):
        # Check linenumber_range returns corrent number of lines
        count = 9
        while count > 0:
            stmt = self.buf.get_next()
            count = count - 1

        # line 9 should be three lines long
        self.assertEqual(3, len(stmt['linerange']))

        # the range should be the correct line numbers
        self.assertEqual([11, 12, 13], list(stmt['linerange']))
