# Copyright 2020 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.

pw_add_module_library(pw_tokenizer
  SOURCES
    encode_args.cc
    tokenize.cc
  PUBLIC_DEPS
    pw_polyfill.overrides
    pw_preprocessor
    pw_span
  PRIVATE_DEPS
    pw_varint
)

pw_add_module_library(pw_tokenizer.base64
  SOURCES
    base64.cc
  PUBLIC_DEPS
    pw_base64
    pw_containers
    pw_polyfill.overrides
    pw_preprocessor
    pw_span
)

pw_add_module_library(pw_tokenizer.decoder
  SOURCES
    decode.cc
    detokenize.cc
    token_database.cc
  PUBLIC_DEPS
    pw_span
    pw_tokenizer
  PRIVATE_DEPS
    pw_varint
)

pw_add_facade(pw_tokenizer.global_handler
  SOURCES
    tokenize_to_global_handler.cc
  PUBLIC_DEPS
    pw_tokenizer
)

pw_add_facade(pw_tokenizer.global_handler_with_payload
  SOURCES
    tokenize_to_global_handler_with_payload.cc
  PUBLIC_DEPS
    pw_tokenizer
)

# TODO(hepler): Use an empty backend that makes tests possible, for now.
add_library(pw_tokenizer.global_handler.backend INTERFACE)
target_link_libraries(pw_tokenizer.global_handler.backend
  INTERFACE
    pw_tokenizer.test_backend)

add_library(pw_tokenizer.global_handler_with_payload.backend INTERFACE)
target_link_libraries(pw_tokenizer.global_handler_with_payload.backend
  INTERFACE
    pw_tokenizer.test_backend)

add_library(pw_tokenizer.test_backend INTERFACE)

# Executable for generating test data for the C++ and Python detokenizers. This
# target should only be built for the host.
add_executable(pw_tokenizer.generate_decoding_test_data EXCLUDE_FROM_ALL
    generate_decoding_test_data.cc)
target_link_libraries(pw_tokenizer.generate_decoding_test_data PRIVATE
    pw_varint pw_tokenizer)
target_compile_options(pw_tokenizer.generate_decoding_test_data PRIVATE
    -Wall -Werror)

# Executable for generating a test ELF file for elf_reader_test.py. A host
# version of this binary is checked in for use in elf_reader_test.py.
add_executable(pw_tokenizer.elf_reader_test_binary EXCLUDE_FROM_ALL
    py/elf_reader_test_binary.c)
target_link_libraries(pw_tokenizer.elf_reader_test_binary PRIVATE
    -Wl,--unresolved-symbols=ignore-all)  # main is not defined
set_target_properties(pw_tokenizer.elf_reader_test_binary PROPERTIES
    OUTPUT_NAME elf_reader_test_binary.elf)

pw_add_test(pw_tokenizer.argument_types_test
  SOURCES
    argument_types_test_c.c
    argument_types_test.cc
  DEPS
    pw_tokenizer
  GROUPS
    modules
    pw_tokenizer
)

pw_add_test(pw_tokenizer.base64_test
  SOURCES
    base64_test.cc
  DEPS
    pw_tokenizer.base64
  GROUPS
    modules
    pw_tokenizer
)

pw_add_test(pw_tokenizer.decode_test
  SOURCES
    decode_test.cc
  DEPS
    pw_varint
    pw_tokenizer.decoder
  GROUPS
    modules
    pw_tokenizer
)

pw_add_test(pw_tokenizer.detokenize_test
  SOURCES
    detokenize_test.cc
  DEPS
    pw_tokenizer.decoder
  GROUPS
    modules
    pw_tokenizer
)

pw_add_test(pw_tokenizer.global_handlers_test
  SOURCES
    global_handlers_test_c.c
    global_handlers_test.cc
  DEPS
    pw_tokenizer.global_handler
    pw_tokenizer.global_handler_with_payload
  GROUPS
    modules
    pw_tokenizer
)

pw_add_test(pw_tokenizer.hash_test
  SOURCES
    hash_test.cc
  DEPS
    pw_tokenizer
  GROUPS
    modules
    pw_tokenizer
)

pw_add_test(pw_tokenizer.token_database_test
  SOURCES
    token_database_test.cc
  DEPS
    pw_tokenizer.decoder
  GROUPS
    modules
    pw_tokenizer
)

pw_add_test(pw_tokenizer.tokenize_test
  SOURCES
    tokenize_test_c.c
    tokenize_test.cc
  DEPS
    pw_varint
    pw_tokenizer
  GROUPS
    modules
    pw_tokenizer
)
