@@ -668,3 +668,191 @@ func TestNoCrashes(t *testing.T) {
668668 ParsePatch (db .DefaultContext , setting .Git .MaxGitDiffLines , setting .Git .MaxGitDiffLineCharacters , setting .Git .MaxGitDiffFiles , strings .NewReader (testcase .gitdiff ), "" )
669669 }
670670}
671+
672+ func TestBuildTree (t * testing.T ) {
673+ tests := []struct {
674+ name string
675+ input []* DiffFile
676+ expected []* FileTreeNode
677+ }{
678+ {
679+ name : "Test case 1" ,
680+ input : []* DiffFile {
681+ {Name : "2/2" , NameHash : "23b3d60a69a4b1bacb1a3b9ced0a8ac609efbf61" },
682+ {Name : "test1" , NameHash : "b444ac06613fc8d63795be9ad0beaf55011936ac" },
683+ },
684+ expected : []* FileTreeNode {
685+ {
686+ Name : "2" ,
687+ IsFile : false ,
688+ Children : []* FileTreeNode {
689+ {
690+ Name : "2" ,
691+ IsFile : true ,
692+ File : & DiffFile {
693+ Name : "2/2" ,
694+ NameHash : "23b3d60a69a4b1bacb1a3b9ced0a8ac609efbf61" ,
695+ },
696+ },
697+ },
698+ },
699+ {
700+ Name : "test1" ,
701+ IsFile : true ,
702+ File : & DiffFile {
703+ Name : "test1" ,
704+ NameHash : "b444ac06613fc8d63795be9ad0beaf55011936ac" ,
705+ },
706+ },
707+ },
708+ },
709+ {
710+ name : "Test case 2" ,
711+ input : []* DiffFile {
712+ {Name : "a/b/c" , NameHash : "hash1" },
713+ {Name : "a/b/d" , NameHash : "hash2" },
714+ {Name : "a/e" , NameHash : "hash3" },
715+ {Name : "f" , NameHash : "hash4" },
716+ },
717+ expected : []* FileTreeNode {
718+ {
719+ Name : "a" ,
720+ IsFile : false ,
721+ Children : []* FileTreeNode {
722+ {
723+ Name : "b" ,
724+ IsFile : false ,
725+ Children : []* FileTreeNode {
726+ {
727+ Name : "c" ,
728+ IsFile : true ,
729+ File : & DiffFile {
730+ Name : "a/b/c" ,
731+ NameHash : "hash1" ,
732+ },
733+ },
734+ {
735+ Name : "d" ,
736+ IsFile : true ,
737+ File : & DiffFile {
738+ Name : "a/b/d" ,
739+ NameHash : "hash2" ,
740+ },
741+ },
742+ },
743+ },
744+ {
745+ Name : "e" ,
746+ IsFile : true ,
747+ File : & DiffFile {
748+ Name : "a/e" ,
749+ NameHash : "hash3" ,
750+ },
751+ },
752+ },
753+ },
754+ {
755+ Name : "f" ,
756+ IsFile : true ,
757+ File : & DiffFile {
758+ Name : "f" ,
759+ NameHash : "hash4" ,
760+ },
761+ },
762+ },
763+ },
764+ {
765+ name : "Test case 3" ,
766+ input : []* DiffFile {
767+ {Name : "dir1/file1" , NameHash : "hash1" },
768+ {Name : "dir1/file2" , NameHash : "hash2" },
769+ {Name : "dir2/file3" , NameHash : "hash3" },
770+ {Name : "dir2/file4" , NameHash : "hash4" },
771+ {Name : "file5" , NameHash : "hash5" },
772+ },
773+ expected : []* FileTreeNode {
774+ {
775+ Name : "dir1" ,
776+ IsFile : false ,
777+ Children : []* FileTreeNode {
778+ {
779+ Name : "file1" ,
780+ IsFile : true ,
781+ File : & DiffFile {
782+ Name : "dir1/file1" ,
783+ NameHash : "hash1" ,
784+ },
785+ },
786+ {
787+ Name : "file2" ,
788+ IsFile : true ,
789+ File : & DiffFile {
790+ Name : "dir1/file2" ,
791+ NameHash : "hash2" ,
792+ },
793+ },
794+ },
795+ },
796+ {
797+ Name : "dir2" ,
798+ IsFile : false ,
799+ Children : []* FileTreeNode {
800+ {
801+ Name : "file3" ,
802+ IsFile : true ,
803+ File : & DiffFile {
804+ Name : "dir2/file3" ,
805+ NameHash : "hash3" ,
806+ },
807+ },
808+ {
809+ Name : "file4" ,
810+ IsFile : true ,
811+ File : & DiffFile {
812+ Name : "dir2/file4" ,
813+ NameHash : "hash4" ,
814+ },
815+ },
816+ },
817+ },
818+ {
819+ Name : "file5" ,
820+ IsFile : true ,
821+ File : & DiffFile {
822+ Name : "file5" ,
823+ NameHash : "hash5" ,
824+ },
825+ },
826+ },
827+ },
828+ }
829+
830+ for _ , tt := range tests {
831+ t .Run (tt .name , func (t * testing.T ) {
832+ result := buildTree (tt .input )
833+ if ! compareFileTreeNodes (result , tt .expected ) {
834+ t .Errorf ("Expected %v, but got %v" , tt .expected , result )
835+ }
836+ })
837+ }
838+ }
839+
840+ func compareFileTreeNodes (a , b []* FileTreeNode ) bool {
841+ if len (a ) != len (b ) {
842+ return false
843+ }
844+ for i := range a {
845+ if a [i ].Name != b [i ].Name || a [i ].IsFile != b [i ].IsFile {
846+ return false
847+ }
848+ if a [i ].IsFile && b [i ].IsFile {
849+ if a [i ].File .Name != b [i ].File .Name || a [i ].File .NameHash != b [i ].File .NameHash {
850+ return false
851+ }
852+ }
853+ if ! compareFileTreeNodes (a [i ].Children , b [i ].Children ) {
854+ return false
855+ }
856+ }
857+ return true
858+ }
0 commit comments