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

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_fuzzer/fuzzer.gni")
import("$dir_pw_unit_test/test.gni")

config("default_config") {
  include_dirs = [ "public" ]
}

pw_source_set("pw_random") {
  public_configs = [ ":default_config" ]
  public = [
    "public/pw_random/random.h",
    "public/pw_random/xor_shift.h",
  ]
  public_deps = [
    dir_pw_assert,
    dir_pw_bytes,
    dir_pw_span,
    dir_pw_status,
  ]
}

pw_source_set("fuzzer_generator") {
  public = [ "public/pw_random/fuzzer.h" ]
  public_deps = [
    ":pw_random",
    "$dir_pw_fuzzer:libfuzzer",
    dir_pw_bytes,
  ]
}

pw_test_group("tests") {
  tests = [ ":xor_shift_star_test" ]
  group_deps = [ ":fuzzers" ]
}

pw_fuzzer_group("fuzzers") {
  fuzzers = [ ":get_int_bounded_fuzzer" ]
}

pw_test("xor_shift_star_test") {
  deps = [
    ":pw_random",
    dir_pw_assert,
  ]
  sources = [ "xor_shift_test.cc" ]
}

pw_fuzzer("get_int_bounded_fuzzer") {
  sources = [ "get_int_bounded_fuzzer.cc" ]
  deps = [
    ":fuzzer_generator",
    ":pw_random",
    dir_pw_assert,
  ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}
