
    [Ih<                        d dl Z d dlmZmZmZ d dlZd dlZd dlZ ej                  ej                  d        ej                  e      Zdededee   fdZd	ededee   fd
Zd	edeeef   fdZdd	ededee   fdZy)    N)OptionalListDictz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatcontent	base_namereturnc                 &   |r| s!t         j                  d       t        d       yt        j                  j                  dd      }| d}t        j                  j                  ||      }	 t        j                  |d       t        |d	d
      5 }|j                  |        ddd       t         j                  d|        |S # 1 sw Y   #xY w# t        $ r6}t         j                  d| d|        t        d| d|        Y d}~yd}~ww xY w)zSave test script to file.

    Args:
        content (str): Content to write to file
        base_name (str): Base name for the file

    Returns:
        Optional[str]: Filename if successful, None otherwise
    z$Filename and content cannot be emptyu(   ❌ Filename and content cannot be emptyNtests	generatedz.txtTexist_okwzutf-8)encodingz Test script saved successfully: zError saving file z: u   ❌ Error saving file )loggererrorprintospathjoinmakedirsopenwriteinfo	Exception)r   r	   
output_dirfilename	file_pathfilees          6D:\Projects\AI-TestCaseGenerator\utils\file_handler.pysave_test_scriptr#      s     G;<89g{3JD!HZ2I	
J.)S73 	 tJJw	 6xjAB	  	   )(2aS9:&xj1#67s0   ,%C C#!C C
C 	D,DD
test_casesc           	      B   |r| s!t         j                  d       t        d       y| d}t        j                  j                  dd      }t        j                  |d       t        j                  j                  ||      }	 t        |       }|s!t         j                  d	       t        |       }nZt         j                  d
t        |       d       g }|j                         D ]#  \  }}t        ||      }	|j                  |	       % |rt        j                  |      nt        j                         }
|
j                  rBt         j!                  d       t        d       t        j                  dgdgdgdgdgdgd      }
d|
j"                  vrd|
d<   n|
d   j%                  d      |
d<   g d}|D ]  }||
j"                  vsd|
|<    d|
j"                  v r|
d   j'                  d       |
d<   |
j%                  d      }
g d}|
j"                  D ]  }||vs|j)                  |        |D cg c]  }||
j"                  v s| }}|
j+                  |      }
t        j,                  |d      5 }|
j/                  |dd       |j0                  d   }t3        |
j"                        D ]~  \  }}t5        |
|   j7                  t8              j'                  t              j5                         t        |            }t;        |dz   d      |j<                  t?        d |z            _          	 ddd       t         j                  d!|        |S c c}w # 1 sw Y   (xY w# tB        $ r0}t         j                  d"|        t        d#|        Y d}~yd}~ww xY w)$zSave test cases to Excel file.

    Args:
        test_cases (str): Test cases content to write to Excel
        base_name (str): Base name for the file

    Returns:
        Optional[str]: Filename if successful, None otherwise
    z'Filename and test cases cannot be emptyu+   ❌ Filename and test cases cannot be emptyNz.xlsxr   r   Tr   z6No TEST TYPE sections found, using traditional parsingzFound z TEST TYPE sections)default_sectionzNo test cases could be parsedu$   ⚠️ No test cases could be parsedzNo test cases found )SectionTitleScenarioStepsExpected ResultActual Resultr(   General)r)   r*   r+   r,   r-   StatusPriorityr+   c           	          t        | t              r5dj                  t        |       D cg c]  \  }}|dz    d|  c}}      S | xs dS c c}}w )N
   z. r'   )
isinstancelistr   	enumerate)xisteps      r"   <lambda>z#save_excel_report.<locals>.<lambda>l   se    s}~  BF  tGdiiajklam@nV]VWY]AaC54&AQ@n6o   NO  NU  SU @ns   A
)r(   r)   r*   r+   r,   r/   r-   r0   )columnsopenpyxl)engineFz
Test Cases)index
sheet_name   2   A   z!Excel report saved successfully: zError saving Excel report: u   ❌ Error saving Excel report: )"r   r   r   r   r   r   r   extract_test_type_sectionsr   parse_traditional_formatlenitemsextendpd	DataFrameemptywarningr;   fillnaapplyappendreindexExcelWriterto_excelsheetsr6   maxastypestrmincolumn_dimensionschrwidthr   )r$   r	   r   r   filepathsections	test_datasection_namesection_contentsection_datadfrequired_columnscolcolumn_orderwriter	worksheetidx
max_lengthr!   s                      r"   save_excel_reportrh   *   so    J>?;<E"Hg{3JKK
T*ww||J1HQ-j9 KKPQ0<I KK&X/BCDI191A /-o7Yef  ./
 )2R\\)$r||~88NN:;89129:D$&4"$ B BJJ&%ByMyM00;ByM t# 	C"**$3	
 bjj W+++  -V  WBwK YYr] {:: 	)C,&##C(	)
 (4Isbjj7HIIZZZ- ^^HZ8 
	[FKKeKEl3I &bjj1 [S sGNN3'--c2668H
 DGzTU~WYCZ	++CSM:@[
	[ 	7zBC# J
	[ 
	[  21#67/s34sW   EM% AM% M% 4MM+M% 7B:M2!M% M% M"M% %	N.&NNc                 l   i }d}t        t        j                  ||             }|si S t        |      D ]~  \  }}|j	                  d      j                         }|j                         }|dz   t        |      k  r||dz      j                         n
t        |       }| || j                         }	|	||<    |S )zExtract sections from test cases content based on TEST TYPE markers.
    
    Args:
        test_cases (str): The full test cases content
        
    Returns:
        Dict[str, str]: Dictionary of section name to section content
    zTEST TYPE:\s*([^\n]+)r3   )	r5   refinditerr6   groupstripendrE   start)
r$   r[   section_patternsection_matchesr8   matchr]   	start_posend_posr^   s
             r"   rC   rC      s     H /O2;;
CDO 	 o. 15{{1~++-IIK	23A#O8L2L/!A#&,,.RUV`Ra$Yw7==?!01 O    r&   c                 
   g }i }|}d}g }t         j                  d|        d| v rSd| v rNt         j                  d       t        j                  d|       }|D ]  }|j	                         }|rt        |      dk  r%d|v s*i }	||	d<   t        j                  d	|      }
|
r"|
j                  d
      j	                         |	d<   t        j                  d|      }|r"|j                  d
      j	                         |	d<   t        j                  d|      }|rC|j                  d
      j	                         }t        j                  d|      }|r||	d<   n|g|	d<   t        j                  d|t        j                        }|r"|j                  d
      j	                         |	d<   t        j                  d|t        j                        }|r"|j                  d
      j	                         |	d<   t        j                  d|      }|r"|j                  d
      j	                         |	d<   |j                  |	       t         j                  d|	d            |r$t         j                  dt        |       d       |S t         j                  d       | j                  d      }d}|t        |      k  r||   j	                         }|d
z  }|s*|j                  d      r%|j                  dd      j	                         xs |}`t        j                  d |      }
|
rA|r|r||d<   |j                  |       ||
j                  d
      j	                         d!}d}g }t        j                  d"|      }|r%|r#|j                  d
      j	                         |d<   t        j                  d#|      }|r|rd$}g }|rt        j                  d%|      rCd}||d<   t        j                  d&|      }|r"|j                  d
      j	                         |d<   qt        j                  d'|      }|rG|j                         d(   r|j                  d)      n|}|j                  |j	                                |j	                         r!|j                  |j	                                t        j                  d&|      }|r&|r$|j                  d
      j	                         |d<   ?t        j                  d*|      }|r&|r$|j                  d
      j	                         |d<   }t        j                  d+|      }|r&|r$|j                  d
      j	                         |d<   |rW|sU|rSd|v r|dxx   d,|z   z  cc<   n>d|v r|dxx   d,|z   z  cc<   n)d|v r|dxx   d,|z   z  cc<   nd|v r|dxx   d,|z   z  cc<   |t        |      k  r|r|r||d<   |j                  |       t         j                  dt        |       d-       |S ).a
  Parse test cases using the traditional format.
    
    Args:
        test_cases (str): Test cases content to parse
        default_section (str): Default section name if none is specified
        
    Returns:
        List[Dict]: List of test case dictionaries
    Fz)Parsing test cases with default section: zTitle:zSteps to reproduce:zDDetected standard test case format with Title and Steps to reproducez\n\s*\n
   r(   zTitle:\s*(.*?)(?:\n|$)r3   r)   zScenario:\s*(.*?)(?:\n|$)r*   z-Steps to reproduce:([\s\S]*?)Expected Result:zK(?:^|\n)\s*(?:\d+\.\s*|\*\s*|\-\s*)(.*?)(?=\n\s*(?:\d+\.\s*|\*\s*|\-\s*)|$)r+   z6Expected Result:\s*(.*?)(?:Actual Result:|Priority:|$)r,   z%Actual Result:\s*(.*?)(?:Priority:|$)r-   zPriority:\s*(.*?)(?:\n|$)r0   zExtracted test case: z
Extracted z test cases using block parsingz)Using line-by-line parsing for test casesr2   r   z####r'   z/^(?:\d+\.\s*)?(?:\*\*)?Title:(?:\*\*)?\s*(.*?)$)r(   r)   z%^(?:\*\*)?Scenario:(?:\*\*)?\s*(.*?)$z+^(?:\*\*)?Steps(?: to reproduce)?:(?:\*\*)?Tz#^(?:\*\*)?Expected Result:(?:\*\*)?z,^(?:\*\*)?Expected Result:(?:\*\*)?\s*(.*?)$z^(?:(\d+)\.|\-|\*)\s*(.*?)$r@   z*^(?:\*\*)?Actual Result:(?:\*\*)?\s*(.*?)$z%^(?:\*\*)?Priority:(?:\*\*)?\s*(.*?)$ z& test cases using line-by-line parsing)r   r   rj   splitrm   rE   searchrl   findallDOTALLrN   debug
startswithreplacerr   groups)r$   r&   r\   current_testcurrent_sectioncollecting_stepscurrent_stepstest_case_blocksblock	test_casetitle_matchscenario_matchsteps_match
steps_text
step_linesexpected_matchactual_matchpriority_matchlinesr8   lineer_match
step_match	step_texts                           r"   rD   rD      s    IL%OM
KK;O;LMN :"7:"EZ[ 88J
;% 0	KEKKMECJO 5 	'6	)$ !ii(A5I)4):):1)=)C)C)EIg& "$+G!O!,:,@,@,C,I,I,KIj) !ii(XZ_`!,!2!21!5!;!;!=J!#,z  }G  "HJ!-7	'* /9\	'* "$+dfkmomvmv!w!3A3G3G3J3P3P3RI/0  "yy)QSXZ\ZcZcd1=1C1CA1F1L1L1NIo. "$+G!O!,:,@,@,C,I,I,KIj)  +4Yw5G4HIJa0	Kd KK*S^$44STU KK;< T"E	A
c%j.Qx~~	Q ??5!"ll3399;NO hhQSWX#,9L)  . +$**1-335L  %M "JDQl'5';';A'>'D'D'FL$ hhMtT<#M xx>E#( (5W% 88$SUYZ6>nnQ6G6M6M6OL!23 "@$GJ3=3D3D3Fr3JJ,,Q/PT	$$Y__%67$$TZZ\2 "QSWXl.<.B.B1.E.K.K.ML*+ xx MtTL,8,>,>q,A,G,G,IL) "JDQl'5';';A'>'D'D'FL$  0T\)Z(C$J6( L0_-t;-"l2./3:=/|+Z(C$J6(} c%j.B $1L!&
KK*S^,,RSTru   )r.   )r   typingr   r   r   loggingpandasrH   rj   basicConfigINFO	getLogger__name__r   rU   r#   rh   rC   rD    ru   r"   <module>r      s    	 ' '   	   ',,/e f			8	$c c hsm >e# e# e(3- eN3 4S> >| |s |SWX\S] |ru   