#!/usr/bin/env python3
# Copyright (C) 2023 The Android Open Source Project
#
# 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 a
#
#      http://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.

from python.generators.diff_tests.testing import Path, DataPath, Metric
from python.generators.diff_tests.testing import Csv, Json, TextProto
from python.generators.diff_tests.testing import DiffTestBlueprint
from python.generators.diff_tests.testing import TestSuite


class SpanJoinSmoke(TestSuite):

  def test_span_join_unordered_cols_synth_1(self):
    return DiffTestBlueprint(
        trace=Path('../common/synth_1.py'),
        query=Path('span_join_unordered_cols_test.sql'),
        out=Csv("""
        "ts","dur","part","b1","b2","b3","a1","a2","a3"
        10,90,0,"A",10,100,"B",2,101
        100,1,0,"B",90,200,"C",3,102
        5,5,1,"A",10,100,"A",1,100
        10,40,1,"A",10,100,"B",2,101
        50,40,1,"B",90,200,"B",2,101
        90,10,1,"C",1,300,"B",2,101
        100,1,1,"C",1,300,"C",3,102
        """))

  def test_span_join_unordered_cols_synth_1_2(self):
    return DiffTestBlueprint(
        trace=Path('../common/synth_1.py'),
        query=Path('span_join_unordered_cols_reverse_test.sql'),
        out=Csv("""
        "ts","dur","part","b1","b2","b3","a1","a2","a3"
        10,90,0,"A",10,100,"B",2,101
        100,1,0,"B",90,200,"C",3,102
        5,5,1,"A",10,100,"A",1,100
        10,40,1,"A",10,100,"B",2,101
        50,40,1,"B",90,200,"B",2,101
        90,10,1,"C",1,300,"B",2,101
        100,1,1,"C",1,300,"C",3,102
        """))

  def test_span_join_zero_negative_dur(self):
    return DiffTestBlueprint(
        trace=DataPath('android_sched_and_ps.pb'),
        query=Path('span_join_zero_negative_dur_test.sql'),
        out=Csv("""
        "ts","dur","part"
        1,0,0
        1,2,0
        5,-1,0
        5,-1,0
        1,1,1
        2,0,1
        """))
