#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

"""Tests for the Observable mixin class."""
# pytype: skip-file

from __future__ import absolute_import

import logging
import unittest
from typing import List
from typing import Optional

from apache_beam.coders import observable


class ObservableMixinTest(unittest.TestCase):
  observed_count = 0
  observed_sum = 0
  observed_keys = []  # type: List[Optional[str]]

  def observer(self, value, key=None):
    self.observed_count += 1
    self.observed_sum += value
    self.observed_keys.append(key)

  def test_observable(self):
    class Watched(observable.ObservableMixin):
      def __iter__(self):
        for i in (1, 4, 3):
          self.notify_observers(i, key='a%d' % i)
          yield i

    watched = Watched()
    watched.register_observer(lambda v, key: self.observer(v, key=key))
    for _ in watched:
      pass

    self.assertEqual(3, self.observed_count)
    self.assertEqual(8, self.observed_sum)
    self.assertEqual(['a1', 'a3', 'a4'], sorted(self.observed_keys))


if __name__ == '__main__':
  logging.getLogger().setLevel(logging.INFO)
  unittest.main()
