
    ɯeiU(                         d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZ dZdee
   d	ee
   fd
ZdedefdZ ed      	 	 ddedededed	df
d       ZeZy)    N)List)experimental)	DataFrame)Row)
StructType_FractionalType_IntegralTypez--- actual ---
+++ expected +++rowsreturnc                 L    d }t        j                  |      }t        | |      S )Nc                 d    t        | |      D ]!  \  }}||k(  r| y| y||kD  r y||k  s! y y)N   r   )zip)row1row2value1value2s       \/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/snowpark/testing.pycompare_rowsz&_get_sorted_rows.<locals>.compare_rows   sO    !$o 
	NFF~&&
	     )key)	functools
cmp_to_keysorted)r
   r   sort_keys      r   _get_sorted_rowsr      s&     ##L1H$H%%r   actualexpectedc                    t        | j                        t        |j                        k(  s4J dt        | j                         dt        |j                         d       t        t        | j                  |j                              D ]  \  }\  }}d}|j                  |j                  k7  rd| d|j                   d|j                   }|j
                  |j
                  k7  rst        |j
                  t              rt        |t              sIt        |j
                  t              rt        |t              sd| d|j
                   d|j
                   }|j                  |j                  k7  rd	| d|j                   d|j                   }|st        |       }t        |      }||k7  s)t        j                  |j                         |j                               }d
j                  |      }	t        | dt          d
|	        y)zM
    Asserts whether two :class:`types.StructType` objects are the same.
    z(Different number of columns: actual has z columns, expected has z columnsNzColumn name mismatch at column 	: actual , expected z$Column data type mismatch at column z#Column nullable mismatch at column 
z
Different schema:
)lenfields	enumerater   namedatatype
isinstancer	   r   nullablestrdifflibndiff
splitlinesjoinAssertionErrorACTUAL_EXPECTED_STRING)
r   r   column_indexactual_fieldexpected_fielderror_message
actual_strexpected_strdiffdiff_strs
             r   _assert_schema_equalr:   %   s9    v}}"  |	1#fmm2D1EE\]`aiapap]q\rrz{|  9BFMM8??+9 44|^  3 33=l^9UaUfUfTggr  tB  tG  tG  sH  IM  N$;$;; |44mD">=A |44oF">?C #G|nT]^j^s^s]tt  AO  AX  AX  @Y  !Z  N$;$;;A,yYeYnYnXooz  |J  |S  |S  {T  UMVJx=L\)}}Z%:%:%<l>U>U>WX99T?$$o%:;Q:RRTU]T^_ 5r   z1.21.0)versionrtolatolc           
         t        | t              st        d      t        |t              st        d      | j                  }|j                  }t	        ||       t        | j                               }t        |j                               }t        |      t        |      k(  s J dt        |       dt        |       d       t        t        ||            D ]  \  }\  }	}
t        t        |	|
            D ]  \  }\  }}d| d| d| d	| }d
}t        |t              rIt        j                  |      t        j                  |      k7  rd}t        j                  ||||      sd}nt        ||k7        }|st        |	      }t        |
      }||k7  st!        j"                  |j%                         |j%                               }dj'                  |      }t)        | dt*         d|         y)am  
    Asserts that two Snowpark :class:`DataFrame` objects are equal. This function compares both the schema and the data
    of the DataFrames. If there are differences, an ``AssertionError`` is raised with a detailed message including differences.
    This function is useful for unit testing and validating data transformations and processing in Snowpark.

    Args:
        actual: The actual DataFrame to be compared.
        expected: The expected DataFrame to compare against.
        rtol: The relative tolerance for comparing float values. Default is 1e-5.
        atol: The absolute tolerance for comparing float values. Default is 1e-8.

    Examples::

        >>> from snowflake.snowpark.testing import assert_dataframe_equal
        >>> from snowflake.snowpark.types import StructType, StructField, IntegerType, StringType, DoubleType
        >>> schema1 = StructType([
        ...     StructField("id", IntegerType()),
        ...     StructField("name", StringType()),
        ...     StructField("value", DoubleType())
        ... ])
        >>> data1 = [[1, "Rice", 1.0], [2, "Saka", 2.0], [3, "White", 3.0]]
        >>> df1 = session.create_dataframe(data1, schema1)
        >>> df2 = session.create_dataframe(data1, schema1)
        >>> assert_dataframe_equal(df2, df1)  # pass, DataFrames are identical

        >>> data2 = [[2, "Saka", 2.0], [1, "Rice", 1.0], [3, "White", 3.0]]  # change the order
        >>> df3 = session.create_dataframe(data2, schema1)
        >>> assert_dataframe_equal(df3, df1)  # pass, DataFrames are identical

        >>> data3 = [[1, "Rice", 1.0], [2, "Saka", 2.0], [4, "Rowe", 4.0]]
        >>> df4 = session.create_dataframe(data3, schema1)
        >>> assert_dataframe_equal(df4, df1)  # doctest: +IGNORE_EXCEPTION_DETAIL
        Traceback (most recent call last):
        AssertionError: Value mismatch on row 2 at column 0: actual 4, expected 3
        Different row:
        --- actual ---
        +++ expected +++
        - Row(ID=4, NAME='Rowe', VALUE=4.0)
        ?        ^        ^^^          ^

        + Row(ID=3, NAME='White', VALUE=3.0)
        ?        ^        ^^^^          ^

        >>> data4 = [[1, "Rice", 1.0], [2, "Saka", 2.0], [3, "White", 3.0001]]
        >>> df5 = session.create_dataframe(data4, schema1)
        >>> assert_dataframe_equal(df5, df1, atol=1e-3)  # pass, DataFrames are identical due to higher error tolerance
        >>> assert_dataframe_equal(df5, df1, atol=1e-5)  # doctest: +IGNORE_EXCEPTION_DETAIL
        Traceback (most recent call last):
        AssertionError: Value mismatch on row 2 at column 2: actual 3.0001, expected 3.0
        Different row:
        --- actual ---
        +++ expected +++
        - Row(ID=3, NAME='White', VALUE=3.0001)
        ?                                  ---

        + Row(ID=3, NAME='White', VALUE=3.0)

        >>> schema2 = StructType([
        ...     StructField("id", IntegerType()),
        ...     StructField("key", StringType()),
        ...     StructField("value", DoubleType())
        ... ])
        >>> df6 = session.create_dataframe(data1, schema2)
        >>> assert_dataframe_equal(df6, df1)  # doctest: +IGNORE_EXCEPTION_DETAIL
        Traceback (most recent call last):
        AssertionError: Column name mismatch at column 1: actual KEY, expected NAME
        Different schema:
        --- actual ---
        +++ expected +++
        - StructType([StructField('ID', LongType(), nullable=True), StructField('KEY', StringType(), nullable=True), StructField('VALUE', DoubleType(), nullable=True)])
        ?                                                                        ^ -

        + StructType([StructField('ID', LongType(), nullable=True), StructField('NAME', StringType(), nullable=True), StructField('VALUE', DoubleType(), nullable=True)])
        ?

        >>> schema3 = StructType([
        ...     StructField("id", IntegerType()),
        ...     StructField("name", StringType()),
        ...     StructField("value", IntegerType())
        ... ])
        >>> df7 = session.create_dataframe(data1, schema3)
        >>> assert_dataframe_equal(df7, df1)  # doctest: +IGNORE_EXCEPTION_DETAIL
        Traceback (most recent call last):
        AssertionError: Column data type mismatch at column 2: actual LongType(), expected DoubleType()
        Different schema:
        --- actual ---
        +++ expected +++
        - StructType([StructField('ID', LongType(), nullable=True), StructField('NAME', StringType(), nullable=True), StructField('VALUE', LongType(), nullable=True)])
        ?                                                                                                                                  ^ ^^

        + StructType([StructField('ID', LongType(), nullable=True), StructField('NAME', StringType(), nullable=True), StructField('VALUE', DoubleType(), nullable=True)])
        ?

    Note:
        1. Data in a Snowpark DataFrame is unordered, so when comparing two DataFrames, this function
        sorts rows based on their values first.

        2. When comparing schemas, :class:`types.IntegerType` and :class:`types.DoubleType` are considered different,
        even if the underlying values are equal (e.g., 2 vs 2.0).

    z#actual must be a Snowpark DataFramez%expected must be a Snowpark DataFramez%Different number of rows: actual has z rows, expected has z rowszValue mismatch on row z at column r!   r"   FT)rel_tolabs_tolr#   z
Different row:
N)r)   r   	TypeErrorschemar:   r   collectr$   r&   r   floatmathisnaniscloseboolr+   r,   r-   r.   r/   r0   r1   )r   r   r<   r=   actual_schemaexpected_schemaactual_rowsexpected_rows	row_index
actual_rowexpected_rowr2   actual_valueexpected_valuer5   failedactual_row_strexpected_row_strr8   r9   s                       r   assert_dataframe_equalrU   O   s   X fi(=>>h	*?@@MMMooO8"6>>#34K$X%5%5%78M{s   o	.s;/?.@@TUXYfUgThhmno  2;K'2 -	-J =F
L)=
 	8L8< 5YK{<.Xabnaooz  |J  {K  LMF.%0::l+tzz./II!F|| .$ "Fln<=!$Z#&|#4 !%55"==&1135E5P5P5RD  $yyH((/);<R;SSUV^U_` -	r   )gh㈵>g:0yE>)r,   r   rE   typingr   "snowflake.snowpark._internal.utilsr   snowflake.snowpark.dataframer   snowflake.snowpark.rowr   snowflake.snowpark.typesr   r   r	   r1   r   r:   rD   rU   assertDataFrameEqual r   r   <module>r]      s   
     ; 2 & O O; &49 &c &&'''T h 	UUU U 	U
 
U  Up . r   