# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from __future__ import absolute_import
import types
import unittest

from telemetry.timeline import counter as counter_module


class FakeProcess(object):
  pass


class CounterIterEventsInThisContainerTest(unittest.TestCase):

  def setUp(self):
    parent = FakeProcess()
    self.counter = counter_module.Counter(parent, 'cat', 'name')

  def assertIsEmptyIterator(self, itr):
    self.assertIsInstance(itr, types.GeneratorType)
    self.assertRaises(StopIteration, itr.next)

  def testEmptyTimestamps(self):
    self.assertIsEmptyIterator(self.counter.IterEventsInThisContainer(
        event_type_predicate=lambda x: True,
        event_predicate=lambda x: True))

  def testEventTypeMismatch(self):
    self.counter.timestamps = [111, 222]
    self.assertIsEmptyIterator(self.counter.IterEventsInThisContainer(
        event_type_predicate=lambda x: False,
        event_predicate=lambda x: True))

  def testNoEventMatch(self):
    self.counter.timestamps = [111, 222]
    self.assertIsEmptyIterator(self.counter.IterEventsInThisContainer(
        event_type_predicate=lambda x: True,
        event_predicate=lambda x: False))

  def testAllMatch(self):
    self.counter.timestamps = [111, 222]
    self.counter.samples = [100, 200]
    events = self.counter.IterEventsInThisContainer(
        event_type_predicate=lambda x: True,
        event_predicate=lambda x: True)
    self.assertIsInstance(events, types.GeneratorType)
    eventlist = list(events)
    self.assertEqual([111, 222], [s.start for s in eventlist])
    self.assertEqual(['cat.name', 'cat.name'], [s.name for s in eventlist])
    self.assertEqual([100, 200], [s.value for s in eventlist])

  def testPartialMatch(self):
    self.counter.timestamps = [111, 222]
    self.counter.samples = [100, 200]
    events = self.counter.IterEventsInThisContainer(
        event_type_predicate=lambda x: True,
        event_predicate=lambda x: x.start > 200)
    self.assertIsInstance(events, types.GeneratorType)
    eventlist = list(events)
    self.assertEqual([222], [s.start for s in eventlist])
    self.assertEqual(['cat.name'], [s.name for s in eventlist])
    self.assertEqual([200], [s.value for s in eventlist])
