# Copyright 2015 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("../../gni/angle.gni")

angle_unittests_sources = [
  "../../util/test_utils_unittest.cpp",
  "../../util/test_utils_unittest_helper.h",
  "../common/BinaryStream_unittest.cpp",
  "../common/CircularBuffer_unittest.cpp",
  "../common/FastVector_unittest.cpp",
  "../common/FixedQueue_unittest.cpp",
  "../common/FixedVector_unittest.cpp",
  "../common/MemoryBuffer_unittest.cpp",
  "../common/Optional_unittest.cpp",
  "../common/PoolAlloc_unittest.cpp",
  "../common/SimpleMutex_unittest.cpp",
  "../common/WorkerThread_unittest.cpp",
  "../common/aligned_memory_unittest.cpp",
  "../common/angleutils_unittest.cpp",
  "../common/bitset_utils_unittest.cpp",
  "../common/hash_utils_unittest.cpp",
  "../common/mathutil_unittest.cpp",
  "../common/matrix_utils_unittest.cpp",
  "../common/partition_alloc/raw_ptr_unittest.cpp",
  "../common/partition_alloc/raw_ref_unittest.cpp",
  "../common/span_unittest.cpp",
  "../common/span_util_unittest.cpp",
  "../common/string_utils_unittest.cpp",
  "../common/system_utils_unittest.cpp",
  "../common/utilities_unittest.cpp",
  "../common/vector_utils_unittest.cpp",
  "../feature_support_util/feature_support_util_unittest.cpp",
  "../gpu_info_util/SystemInfo_unittest.cpp",
  "../image_util/AstcDecompressorTestUtils.h",
  "../image_util/AstcDecompressor_unittest.cpp",
  "../image_util/LoadToNative_unittest.cpp",
  "../libANGLE/BlendStateExt_unittest.cpp",
  "../libANGLE/BlobCache_unittest.cpp",
  "../libANGLE/Config_unittest.cpp",
  "../libANGLE/ContextMutex_unittest.cpp",
  "../libANGLE/Decompress_unittest.cpp",
  "../libANGLE/Fence_unittest.cpp",
  "../libANGLE/GlobalMutex_unittest.cpp",
  "../libANGLE/HandleAllocator_unittest.cpp",
  "../libANGLE/ImageIndexIterator_unittest.cpp",
  "../libANGLE/Image_unittest.cpp",
  "../libANGLE/Observer_unittest.cpp",
  "../libANGLE/Program_unittest.cpp",
  "../libANGLE/ResourceManager_unittest.cpp",
  "../libANGLE/ResourceMap_unittest.cpp",
  "../libANGLE/SizedMRUCache_unittest.cpp",
  "../libANGLE/Surface_unittest.cpp",
  "../libANGLE/TransformFeedback_unittest.cpp",
  "../libANGLE/UnlockedTailCall_unittest.cpp",
  "../libANGLE/VaryingPacking_unittest.cpp",
  "../libANGLE/VertexArray_unittest.cpp",
  "../libANGLE/renderer/BufferImpl_mock.h",
  "../libANGLE/renderer/FramebufferImpl_mock.h",
  "../libANGLE/renderer/ImageImpl_mock.h",
  "../libANGLE/renderer/ProgramImpl_mock.h",
  "../libANGLE/renderer/RenderbufferImpl_mock.h",
  "../libANGLE/renderer/TextureImpl_mock.h",
  "../libANGLE/renderer/TransformFeedbackImpl_mock.h",
  "../libANGLE/renderer/serial_utils_unittest.cpp",
  "angle_unittests_utils.h",
  "preprocessor_tests/MockDiagnostics.h",
  "preprocessor_tests/MockDirectiveHandler.h",
  "preprocessor_tests/PreprocessorTest.cpp",
  "preprocessor_tests/PreprocessorTest.h",
  "preprocessor_tests/char_test.cpp",
  "preprocessor_tests/comment_test.cpp",
  "preprocessor_tests/define_test.cpp",
  "preprocessor_tests/error_test.cpp",
  "preprocessor_tests/extension_test.cpp",
  "preprocessor_tests/identifier_test.cpp",
  "preprocessor_tests/if_test.cpp",
  "preprocessor_tests/input_test.cpp",
  "preprocessor_tests/location_test.cpp",
  "preprocessor_tests/number_test.cpp",
  "preprocessor_tests/operator_test.cpp",
  "preprocessor_tests/pragma_test.cpp",
  "preprocessor_tests/space_test.cpp",
  "preprocessor_tests/token_test.cpp",
  "preprocessor_tests/version_test.cpp",
  "test_expectations/GPUTestExpectationsParser_unittest.cpp",
  "test_utils/angle_test_instantiate.h",
  "test_utils/compiler_test.cpp",
  "test_utils/compiler_test.h",
]

angle_unittests_compiler_tests_sources = [
  "compiler_tests/API_test.cpp",
  "compiler_tests/CollectVariables_test.cpp",
  "compiler_tests/ConstructCompiler_test.cpp",
  "compiler_tests/FloatLex_test.cpp",
  "compiler_tests/GeometryShader_test.cpp",
  "compiler_tests/GlFragDataNotModified_test.cpp",
  "compiler_tests/HashNames_test.cpp",
  "compiler_tests/ImmutableString_test.cpp",
  "compiler_tests/IntermNode_test.cpp",
  "compiler_tests/NV_draw_buffers_test.cpp",
  "compiler_tests/Parse_test.cpp",
  "compiler_tests/PruneEmptyCases_test.cpp",
  "compiler_tests/PruneEmptyDeclarations_test.cpp",
  "compiler_tests/PruneNoOps_test.cpp",
  "compiler_tests/PrunePureLiteralStatements_test.cpp",
  "compiler_tests/PruneUnusedFunctions_test.cpp",
  "compiler_tests/QualificationOrderESSL31_test.cpp",
  "compiler_tests/QualificationOrder_test.cpp",
  "compiler_tests/RecordConstantPrecision_test.cpp",
  "compiler_tests/RemoveUnreferencedVariables_test.cpp",
  "compiler_tests/SamplerMultisample_test.cpp",
  "compiler_tests/ShCompile_test.cpp",
  "compiler_tests/ShaderValidation_test.cpp",
  "compiler_tests/ShaderVariable_test.cpp",
  "compiler_tests/SimplifyLoopConditions_test.cpp",
  "compiler_tests/TextureFunction_test.cpp",
  "compiler_tests/TypeTracking_test.cpp",
  "compiler_tests/Type_test.cpp",
  "compiler_tests/VariablePacker_test.cpp",
  "compiler_tests/WorkGroupSize_test.cpp",
  "test_utils/ShaderCompileTreeTest.cpp",
  "test_utils/ShaderCompileTreeTest.h",
]

angle_unittests_glsl_mac_sources =
    [ "compiler_tests/UnfoldShortCircuitAST_test.cpp" ]

angle_unittests_hlsl_sources = [ "compiler_tests/UnrollFlatten_test.cpp" ]

angle_unittests_gl_sources = [
  "../libANGLE/renderer/gl/DisplayGL_unittest.cpp",
  "../libANGLE/renderer/gl/StateManagerGL_unittest.cpp",
  "../libANGLE/renderer/gl/renderergl_utils_unittest.cpp",
]

angle_unittests_msl_sources = [
  "../common/apple/ObjCPtr_test.mm",
  "../libANGLE/renderer/metal/VertexArrayMtl_unittest.mm",
  "../tests/compiler_tests/MSLOutput_test.cpp",
]

angle_unittests_wgsl_sources = [ "../tests/compiler_tests/WGSLOutput_test.cpp" ]

angle_unittests_sources += [ "compiler_tests/ImmutableString_test_autogen.cpp" ]

if (!is_android && !is_fuchsia && !is_ios) {
  angle_unittests_sources += [ "test_utils/runner/TestSuite_unittest.cpp" ]
}

if (is_linux || is_chromeos) {
  angle_unittests_sources += [ "../common/linux/window_system_unittest.cpp" ]
}

if (angle_enable_vulkan) {
  angle_unittests_sources += [ "../common/vulkan/vulkan_icd_unittest.cpp" ]
}
