#
# Copyright 2019 The Abseil 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.
#

absl_cc_library(
  NAME
    random_random
  HDRS
    "random.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_distributions
    absl::random_internal_nonsecure_base
    absl::random_internal_pcg_engine
    absl::random_internal_pool_urbg
    absl::random_internal_randen_engine
    absl::random_seed_sequences
)

absl_cc_library(
  NAME
    random_bit_gen_ref
  HDRS
    "bit_gen_ref.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::core_headers
    absl::random_internal_distribution_caller
    absl::random_internal_fast_uniform_bits
    absl::type_traits
)

absl_cc_test(
  NAME
    random_bit_gen_ref_test
  SRCS
    "bit_gen_ref_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_bit_gen_ref
    absl::random_random
    absl::random_internal_sequence_urbg
    absl::fast_type_id
    GTest::gmock
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_mock_helpers
  HDRS
    "internal/mock_helpers.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::fast_type_id
    absl::optional
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_mock_overload_set
  HDRS
    "internal/mock_overload_set.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_mocking_bit_gen
    absl::random_internal_mock_helpers
  TESTONLY
)

absl_cc_library(
  NAME
    random_mocking_bit_gen
  HDRS
    "mock_distributions.h"
    "mocking_bit_gen.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::flat_hash_map
    absl::raw_logging_internal
    absl::random_distributions
    absl::random_internal_distribution_caller
    absl::random_internal_mock_overload_set
    absl::random_random
    absl::strings
    absl::span
    absl::type_traits
    absl::utility
    absl::variant
    GTest::gmock
    GTest::gtest
  PUBLIC
  TESTONLY
)

absl_cc_test(
  NAME
    random_mock_distributions_test
  SRCS
    "mock_distributions_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_mocking_bit_gen
    absl::random_random
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_mocking_bit_gen_test
  SRCS
    "mocking_bit_gen_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_bit_gen_ref
    absl::random_mocking_bit_gen
    absl::random_random
    GTest::gmock
    GTest::gtest_main
)

absl_cc_library(
  NAME
    random_distributions
  SRCS
    "discrete_distribution.cc"
    "gaussian_distribution.cc"
  HDRS
    "bernoulli_distribution.h"
    "beta_distribution.h"
    "discrete_distribution.h"
    "distributions.h"
    "exponential_distribution.h"
    "gaussian_distribution.h"
    "log_uniform_int_distribution.h"
    "poisson_distribution.h"
    "uniform_int_distribution.h"
    "uniform_real_distribution.h"
    "zipf_distribution.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::base_internal
    absl::config
    absl::core_headers
    absl::random_internal_generate_real
    absl::random_internal_distribution_caller
    absl::random_internal_fast_uniform_bits
    absl::random_internal_fastmath
    absl::random_internal_iostream_state_saver
    absl::random_internal_traits
    absl::random_internal_uniform_helper
    absl::random_internal_wide_multiply
    absl::strings
    absl::type_traits
)

absl_cc_library(
  NAME
    random_seed_gen_exception
  SRCS
    "seed_gen_exception.cc"
  HDRS
    "seed_gen_exception.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
)

absl_cc_library(
  NAME
    random_seed_sequences
  SRCS
    "seed_sequences.cc"
  HDRS
    "seed_sequences.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
    absl::inlined_vector
    absl::random_internal_pool_urbg
    absl::random_internal_salted_seed_seq
    absl::random_internal_seed_material
    absl::random_seed_gen_exception
    absl::span
)

absl_cc_test(
  NAME
    random_bernoulli_distribution_test
  SRCS
    "bernoulli_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_distributions
    absl::random_random
    absl::random_internal_sequence_urbg
    absl::random_internal_pcg_engine
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_beta_distribution_test
  SRCS
    "beta_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::numeric_representation
    absl::random_distributions
    absl::random_random
    absl::random_internal_distribution_test_util
    absl::random_internal_sequence_urbg
    absl::random_internal_pcg_engine
    absl::strings
    absl::str_format
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_distributions_test
  SRCS
    "distributions_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_distributions
    absl::random_random
    absl::random_internal_distribution_test_util
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_generators_test
  SRCS
    "generators_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_distributions
    absl::random_random
    absl::raw_logging_internal
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_log_uniform_int_distribution_test
  SRCS
    "log_uniform_int_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_pcg_engine
    absl::random_internal_sequence_urbg
    absl::random_random
    absl::strings
    absl::str_format
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_discrete_distribution_test
  SRCS
    "discrete_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_pcg_engine
    absl::random_internal_sequence_urbg
    absl::random_random
    absl::strings
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_poisson_distribution_test
  SRCS
    "poisson_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_distributions
    absl::random_random
    absl::core_headers
    absl::flat_hash_map
    absl::log
    absl::random_internal_distribution_test_util
    absl::random_internal_pcg_engine
    absl::random_internal_sequence_urbg
    absl::strings
    absl::str_format
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_exponential_distribution_test
  SRCS
    "exponential_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::core_headers
    absl::log
    absl::numeric_representation
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_pcg_engine
    absl::random_internal_sequence_urbg
    absl::random_random
    absl::strings
    absl::str_format
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_gaussian_distribution_test
  SRCS
    "gaussian_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::core_headers
    absl::log
    absl::numeric_representation
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_sequence_urbg
    absl::random_random
    absl::strings
    absl::str_format
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_uniform_int_distribution_test
  SRCS
    "uniform_int_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_pcg_engine
    absl::random_internal_sequence_urbg
    absl::random_random
    absl::strings
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_uniform_real_distribution_test
  SRCS
    "uniform_real_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::numeric_representation
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_pcg_engine
    absl::random_internal_sequence_urbg
    absl::random_random
    absl::strings
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_zipf_distribution_test
  SRCS
    "zipf_distribution_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_pcg_engine
    absl::random_internal_sequence_urbg
    absl::random_random
    absl::strings
    GTest::gmock
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_examples_test
  SRCS
    "examples_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_random
    GTest::gtest_main
)

absl_cc_test(
  NAME
    random_seed_sequences_test
  SRCS
    "seed_sequences_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_seed_sequences
    absl::random_internal_nonsecure_base
    absl::random_random
    GTest::gmock
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_traits
  HDRS
    "internal/traits.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_distribution_caller
  HDRS
    "internal/distribution_caller.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
    absl::utility
    absl::fast_type_id
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_fast_uniform_bits
  HDRS
    "internal/fast_uniform_bits.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_seed_material
  SRCS
    "internal/seed_material.cc"
  HDRS
    "internal/seed_material.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
    $<$<BOOL:${MINGW}>:-lbcrypt>
  DEPS
    absl::core_headers
    absl::optional
    absl::random_internal_fast_uniform_bits
    absl::raw_logging_internal
    absl::span
    absl::strings
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_pool_urbg
  SRCS
    "internal/pool_urbg.cc"
  HDRS
    "internal/pool_urbg.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::base
    absl::config
    absl::core_headers
    absl::endian
    absl::random_internal_randen
    absl::random_internal_seed_material
    absl::random_internal_traits
    absl::random_seed_gen_exception
    absl::raw_logging_internal
    absl::span
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_explicit_seed_seq
  HDRS
      "internal/random_internal_explicit_seed_seq.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
    absl::endian
  TESTONLY
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_sequence_urbg
  HDRS
    "internal/sequence_urbg.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
  TESTONLY
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_salted_seed_seq
  HDRS
    "internal/salted_seed_seq.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::inlined_vector
    absl::optional
    absl::span
    absl::random_internal_seed_material
    absl::type_traits
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_iostream_state_saver
  HDRS
    "internal/iostream_state_saver.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::int128
    absl::type_traits
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_generate_real
  HDRS
    "internal/generate_real.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::bits
    absl::random_internal_fastmath
    absl::random_internal_traits
    absl::type_traits
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_wide_multiply
  HDRS
    "internal/wide_multiply.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::bits
    absl::config
    absl::int128
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_fastmath
  HDRS
    "internal/fastmath.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::bits
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_nonsecure_base
  HDRS
    "internal/nonsecure_base.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::core_headers
    absl::inlined_vector
    absl::random_internal_pool_urbg
    absl::random_internal_salted_seed_seq
    absl::random_internal_seed_material
    absl::span
    absl::type_traits
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_pcg_engine
  HDRS
    "internal/pcg_engine.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
    absl::int128
    absl::random_internal_fastmath
    absl::random_internal_iostream_state_saver
    absl::type_traits
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_randen_engine
  HDRS
    "internal/randen_engine.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::endian
    absl::random_internal_iostream_state_saver
    absl::random_internal_randen
    absl::raw_logging_internal
    absl::type_traits
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_platform
  HDRS
    "internal/randen_traits.h"
    "internal/platform.h"
  SRCS
    "internal/randen_round_keys.cc"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_randen
  SRCS
    "internal/randen.cc"
  HDRS
    "internal/randen.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_platform
    absl::random_internal_randen_hwaes
    absl::random_internal_randen_slow
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_randen_slow
  SRCS
    "internal/randen_slow.cc"
  HDRS
    "internal/randen_slow.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_platform
    absl::config
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_randen_hwaes
  SRCS
    "internal/randen_detect.cc"
  HDRS
    "internal/randen_detect.h"
    "internal/randen_hwaes.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
    ${ABSL_RANDOM_RANDEN_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_platform
    absl::random_internal_randen_hwaes_impl
    absl::config
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_randen_hwaes_impl
  SRCS
    "internal/randen_hwaes.cc"
    "internal/randen_hwaes.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
    ${ABSL_RANDOM_RANDEN_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_platform
    absl::config
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_distribution_test_util
  SRCS
    "internal/chi_square.cc"
    "internal/distribution_test_util.cc"
  HDRS
    "internal/chi_square.h"
    "internal/distribution_test_util.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
    absl::core_headers
    absl::raw_logging_internal
    absl::strings
    absl::str_format
    absl::span
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_traits_test
  SRCS
    "internal/traits_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_traits
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_generate_real_test
  SRCS
    "internal/generate_real_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::bits
    absl::flags
    absl::random_internal_generate_real
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_distribution_test_util_test
  SRCS
    "internal/distribution_test_util_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_distribution_test_util
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_fastmath_test
  SRCS
    "internal/fastmath_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_fastmath
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_explicit_seed_seq_test
  SRCS
    "internal/explicit_seed_seq_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_explicit_seed_seq
    absl::random_seed_sequences
    GTest::gmock
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_salted_seed_seq_test
  SRCS
    "internal/salted_seed_seq_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_salted_seed_seq
    GTest::gmock
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_chi_square_test
  SRCS
    "internal/chi_square_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::core_headers
    absl::random_internal_distribution_test_util
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_fast_uniform_bits_test
  SRCS
    "internal/fast_uniform_bits_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_fast_uniform_bits
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_nonsecure_base_test
  SRCS
    "internal/nonsecure_base_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_nonsecure_base
    absl::random_random
    absl::random_distributions
    absl::random_seed_sequences
    absl::strings
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_seed_material_test
  SRCS
    "internal/seed_material_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_seed_material
    GTest::gmock
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_pool_urbg_test
  SRCS
    "internal/pool_urbg_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_pool_urbg
    absl::span
    absl::type_traits
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_pcg_engine_test
  SRCS
    "internal/pcg_engine_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_explicit_seed_seq
    absl::random_internal_pcg_engine
    absl::time
    GTest::gmock
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_randen_engine_test
  SRCS
    "internal/randen_engine_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::random_internal_explicit_seed_seq
    absl::random_internal_randen_engine
    absl::strings
    absl::time
    GTest::gmock
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_randen_test
  SRCS
    "internal/randen_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_randen
    absl::type_traits
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_randen_slow_test
  SRCS
    "internal/randen_slow_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::endian
    absl::random_internal_randen_slow
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_randen_hwaes_test
  SRCS
    "internal/randen_hwaes_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::log
    absl::random_internal_platform
    absl::random_internal_randen_hwaes
    absl::random_internal_randen_hwaes_impl
    absl::str_format
    GTest::gmock
    GTest::gtest
)

# Internal-only target, do not depend on directly.
absl_cc_library(
  NAME
    random_internal_uniform_helper
  HDRS
    "internal/uniform_helper.h"
  COPTS
    ${ABSL_DEFAULT_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::config
    absl::random_internal_traits
    absl::type_traits
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_uniform_helper_test
  SRCS
    "internal/uniform_helper_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_uniform_helper
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_iostream_state_saver_test
  SRCS
    "internal/iostream_state_saver_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_iostream_state_saver
    GTest::gtest_main
)

# Internal-only target, do not depend on directly.
absl_cc_test(
  NAME
    random_internal_wide_multiply_test
  SRCS
      internal/wide_multiply_test.cc
  COPTS
    ${ABSL_TEST_COPTS}
  LINKOPTS
    ${ABSL_DEFAULT_LINKOPTS}
  DEPS
    absl::random_internal_wide_multiply
    absl::bits
    absl::int128
    GTest::gmock
    GTest::gtest_main
)
