#!/usr/bin/env python3
# Copyright 2021 The Pigweed Authors
#
# 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
#
#     https://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 decoding metadata from log strings."""

import unittest

from pw_log_tokenized import FormatStringWithMetadata


class TestFormatStringWithMetadata(unittest.TestCase):
    """Tests extracting metadata from a pw_log_tokenized-style format string."""
    def test_all_fields(self):
        log = FormatStringWithMetadata(
            '■msg♦hello %d■file♦__FILE__■module♦log module name!')
        self.assertEqual(log.message, 'hello %d')
        self.assertEqual(log.module, 'log module name!')
        self.assertEqual(log.file, '__FILE__')

    def test_different_fields(self):
        log = FormatStringWithMetadata('■msg♦hello %d■module♦■THING♦abc123')
        self.assertEqual(log.message, 'hello %d')
        self.assertEqual(log.module, '')
        self.assertEqual(log.file, '')
        self.assertEqual(log.fields['THING'], 'abc123')

    def test_no_metadata(self):
        log = FormatStringWithMetadata('a■msg♦not formatted correctly')
        self.assertEqual(log.message, log.raw_string)
        self.assertEqual(log.module, '')
        self.assertEqual(log.file, '')

    def test_invalid_field_name(self):
        log = FormatStringWithMetadata('■msg♦M♦S♦G■1abc♦abc■other♦hi')
        self.assertEqual(log.message, 'M♦S♦G■1abc♦abc')
        self.assertEqual(log.fields['other'], 'hi')

    def test_delimiters_in_value(self):
        log = FormatStringWithMetadata('■msg♦♦■♦■yo■module♦M♦DU■E')
        self.assertEqual(log.message, '♦■♦■yo')
        self.assertEqual(log.module, 'M♦DU■E')


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