@@ -407,6 +407,357 @@ describe('SideBySideRenderer', () => {
407
407
` ) ;
408
408
} ) ;
409
409
410
+ it ( 'should handle files without newlines at the end' , ( ) => {
411
+ const exampleJson : DiffFile [ ] = [
412
+ {
413
+ blocks : [
414
+ // Scenario 1: Old file missing newline, new file has newline
415
+ {
416
+ lines : [
417
+ {
418
+ content : '-oldLine1' ,
419
+ type : LineType . DELETE ,
420
+ oldNumber : 1 ,
421
+ newNumber : undefined ,
422
+ } ,
423
+ {
424
+ content : '\\ No newline at end of file' ,
425
+ type : LineType . CONTEXT ,
426
+ oldNumber : 1 ,
427
+ newNumber : 1 ,
428
+ } ,
429
+ {
430
+ content : '+newLine1' ,
431
+ type : LineType . INSERT ,
432
+ oldNumber : undefined ,
433
+ newNumber : 1 ,
434
+ } ,
435
+ ] ,
436
+ oldStartLine : 1 ,
437
+ newStartLine : 1 ,
438
+ header : '@@ -1 +1 @@' ,
439
+ } ,
440
+ // Scenario 2: Old file has newline, new file missing newline
441
+ {
442
+ lines : [
443
+ {
444
+ content : '-oldLine2' ,
445
+ type : LineType . DELETE ,
446
+ oldNumber : 2 ,
447
+ newNumber : undefined ,
448
+ } ,
449
+ {
450
+ content : '+newLine2' ,
451
+ type : LineType . INSERT ,
452
+ oldNumber : undefined ,
453
+ newNumber : 2 ,
454
+ } ,
455
+ {
456
+ content : '\\ No newline at end of file' ,
457
+ type : LineType . CONTEXT ,
458
+ oldNumber : 2 ,
459
+ newNumber : 2 ,
460
+ } ,
461
+ ] ,
462
+ oldStartLine : 2 ,
463
+ newStartLine : 2 ,
464
+ header : '@@ -2 +2 @@' ,
465
+ } ,
466
+ // Scenario 3: Both files missing newline
467
+ {
468
+ lines : [
469
+ {
470
+ content : '-oldLine3' ,
471
+ type : LineType . DELETE ,
472
+ oldNumber : 3 ,
473
+ newNumber : undefined ,
474
+ } ,
475
+ {
476
+ content : '\\ No newline at end of file' ,
477
+ type : LineType . CONTEXT ,
478
+ oldNumber : 3 ,
479
+ newNumber : 3 ,
480
+ } ,
481
+ {
482
+ content : '+newLine3' ,
483
+ type : LineType . INSERT ,
484
+ oldNumber : undefined ,
485
+ newNumber : 3 ,
486
+ } ,
487
+ {
488
+ content : '\\ No newline at end of file' ,
489
+ type : LineType . CONTEXT ,
490
+ oldNumber : 3 ,
491
+ newNumber : 3 ,
492
+ } ,
493
+ ] ,
494
+ oldStartLine : 3 ,
495
+ newStartLine : 3 ,
496
+ header : '@@ -3 +3 @@' ,
497
+ } ,
498
+ ] ,
499
+ deletedLines : 3 ,
500
+ addedLines : 3 ,
501
+ oldName : 'sample' ,
502
+ language : 'txt' ,
503
+ newName : 'sample' ,
504
+ isCombined : false ,
505
+ isGitDiff : true ,
506
+ } ,
507
+ ] ;
508
+
509
+ const hoganUtils = new HoganJsUtils ( { } ) ;
510
+ const sideBySideRenderer = new SideBySideRenderer ( hoganUtils , { } ) ;
511
+ const html = sideBySideRenderer . render ( exampleJson ) ;
512
+ expect ( html ) . toMatchInlineSnapshot ( `
513
+ "<div class="d2h-wrapper d2h-light-color-scheme">
514
+ <div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
515
+ <div class="d2h-file-header">
516
+ <span class="d2h-file-name-wrapper">
517
+ <svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
518
+ <path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
519
+ </svg> <span class="d2h-file-name">sample</span>
520
+ <span class="d2h-tag d2h-changed d2h-changed-tag">CHANGED</span></span>
521
+ <label class="d2h-file-collapse">
522
+ <input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
523
+ Viewed
524
+ </label>
525
+ </div>
526
+ <div class="d2h-files-diff">
527
+ <div class="d2h-file-side-diff">
528
+ <div class="d2h-code-wrapper">
529
+ <table class="d2h-diff-table">
530
+ <tbody class="d2h-diff-tbody">
531
+ <tr>
532
+ <td class="d2h-code-side-linenumber d2h-info"></td>
533
+ <td class="d2h-info">
534
+ <div class="d2h-code-side-line">@@ -1 +1 @@</div>
535
+ </td>
536
+ </tr><tr>
537
+ <td class="d2h-code-side-linenumber d2h-del">
538
+ 1
539
+ </td>
540
+ <td class="d2h-del">
541
+ <div class="d2h-code-side-line">
542
+ <span class="d2h-code-line-prefix">-</span>
543
+ <span class="d2h-code-line-ctn">oldLine1</span>
544
+ </div>
545
+ </td>
546
+ </tr><tr>
547
+ <td class="d2h-code-side-linenumber d2h-cntx">
548
+ 1
549
+ </td>
550
+ <td class="d2h-cntx">
551
+ <div class="d2h-code-side-line">
552
+ <span class="d2h-code-line-prefix">\\</span>
553
+ <span class="d2h-code-line-ctn"> No newline at end of file</span>
554
+ </div>
555
+ </td>
556
+ </tr><tr>
557
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
558
+
559
+ </td>
560
+ <td class="d2h-cntx d2h-emptyplaceholder">
561
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
562
+ <span class="d2h-code-line-prefix"> </span>
563
+ <span class="d2h-code-line-ctn"><br></span>
564
+ </div>
565
+ </td>
566
+ </tr><tr>
567
+ <td class="d2h-code-side-linenumber d2h-info"></td>
568
+ <td class="d2h-info">
569
+ <div class="d2h-code-side-line">@@ -2 +2 @@</div>
570
+ </td>
571
+ </tr><tr>
572
+ <td class="d2h-code-side-linenumber d2h-del d2h-change">
573
+ 2
574
+ </td>
575
+ <td class="d2h-del d2h-change">
576
+ <div class="d2h-code-side-line">
577
+ <span class="d2h-code-line-prefix">-</span>
578
+ <span class="d2h-code-line-ctn"><del>oldLine2</del></span>
579
+ </div>
580
+ </td>
581
+ </tr><tr>
582
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
583
+
584
+ </td>
585
+ <td class="d2h-cntx d2h-emptyplaceholder">
586
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
587
+ <span class="d2h-code-line-prefix"> </span>
588
+ <span class="d2h-code-line-ctn"><br></span>
589
+ </div>
590
+ </td>
591
+ </tr><tr>
592
+ <td class="d2h-code-side-linenumber d2h-info"></td>
593
+ <td class="d2h-info">
594
+ <div class="d2h-code-side-line">@@ -3 +3 @@</div>
595
+ </td>
596
+ </tr><tr>
597
+ <td class="d2h-code-side-linenumber d2h-del">
598
+ 3
599
+ </td>
600
+ <td class="d2h-del">
601
+ <div class="d2h-code-side-line">
602
+ <span class="d2h-code-line-prefix">-</span>
603
+ <span class="d2h-code-line-ctn">oldLine3</span>
604
+ </div>
605
+ </td>
606
+ </tr><tr>
607
+ <td class="d2h-code-side-linenumber d2h-cntx">
608
+ 3
609
+ </td>
610
+ <td class="d2h-cntx">
611
+ <div class="d2h-code-side-line">
612
+ <span class="d2h-code-line-prefix">\\</span>
613
+ <span class="d2h-code-line-ctn"> No newline at end of file</span>
614
+ </div>
615
+ </td>
616
+ </tr><tr>
617
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
618
+
619
+ </td>
620
+ <td class="d2h-cntx d2h-emptyplaceholder">
621
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
622
+ <span class="d2h-code-line-prefix"> </span>
623
+ <span class="d2h-code-line-ctn"><br></span>
624
+ </div>
625
+ </td>
626
+ </tr><tr>
627
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
628
+
629
+ </td>
630
+ <td class="d2h-cntx d2h-emptyplaceholder">
631
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
632
+ <span class="d2h-code-line-prefix"> </span>
633
+ <span class="d2h-code-line-ctn"><br></span>
634
+ </div>
635
+ </td>
636
+ </tr>
637
+ </tbody>
638
+ </table>
639
+ </div>
640
+ </div>
641
+ <div class="d2h-file-side-diff">
642
+ <div class="d2h-code-wrapper">
643
+ <table class="d2h-diff-table">
644
+ <tbody class="d2h-diff-tbody">
645
+ <tr>
646
+ <td class="d2h-code-side-linenumber d2h-info"></td>
647
+ <td class="d2h-info">
648
+ <div class="d2h-code-side-line"> </div>
649
+ </td>
650
+ </tr><tr>
651
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
652
+
653
+ </td>
654
+ <td class="d2h-cntx d2h-emptyplaceholder">
655
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
656
+ <span class="d2h-code-line-prefix"> </span>
657
+ <span class="d2h-code-line-ctn"><br></span>
658
+ </div>
659
+ </td>
660
+ </tr><tr>
661
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
662
+
663
+ </td>
664
+ <td class="d2h-cntx d2h-emptyplaceholder">
665
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
666
+ <span class="d2h-code-line-prefix"> </span>
667
+ <span class="d2h-code-line-ctn"><br></span>
668
+ </div>
669
+ </td>
670
+ </tr><tr>
671
+ <td class="d2h-code-side-linenumber d2h-ins">
672
+ 1
673
+ </td>
674
+ <td class="d2h-ins">
675
+ <div class="d2h-code-side-line">
676
+ <span class="d2h-code-line-prefix">+</span>
677
+ <span class="d2h-code-line-ctn">newLine1</span>
678
+ </div>
679
+ </td>
680
+ </tr><tr>
681
+ <td class="d2h-code-side-linenumber d2h-info"></td>
682
+ <td class="d2h-info">
683
+ <div class="d2h-code-side-line"> </div>
684
+ </td>
685
+ </tr><tr>
686
+ <td class="d2h-code-side-linenumber d2h-ins d2h-change">
687
+ 2
688
+ </td>
689
+ <td class="d2h-ins d2h-change">
690
+ <div class="d2h-code-side-line">
691
+ <span class="d2h-code-line-prefix">+</span>
692
+ <span class="d2h-code-line-ctn"><ins>newLine2</ins></span>
693
+ </div>
694
+ </td>
695
+ </tr><tr>
696
+ <td class="d2h-code-side-linenumber d2h-cntx">
697
+ 2
698
+ </td>
699
+ <td class="d2h-cntx">
700
+ <div class="d2h-code-side-line">
701
+ <span class="d2h-code-line-prefix">\\</span>
702
+ <span class="d2h-code-line-ctn"> No newline at end of file</span>
703
+ </div>
704
+ </td>
705
+ </tr><tr>
706
+ <td class="d2h-code-side-linenumber d2h-info"></td>
707
+ <td class="d2h-info">
708
+ <div class="d2h-code-side-line"> </div>
709
+ </td>
710
+ </tr><tr>
711
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
712
+
713
+ </td>
714
+ <td class="d2h-cntx d2h-emptyplaceholder">
715
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
716
+ <span class="d2h-code-line-prefix"> </span>
717
+ <span class="d2h-code-line-ctn"><br></span>
718
+ </div>
719
+ </td>
720
+ </tr><tr>
721
+ <td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
722
+
723
+ </td>
724
+ <td class="d2h-cntx d2h-emptyplaceholder">
725
+ <div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
726
+ <span class="d2h-code-line-prefix"> </span>
727
+ <span class="d2h-code-line-ctn"><br></span>
728
+ </div>
729
+ </td>
730
+ </tr><tr>
731
+ <td class="d2h-code-side-linenumber d2h-ins">
732
+ 3
733
+ </td>
734
+ <td class="d2h-ins">
735
+ <div class="d2h-code-side-line">
736
+ <span class="d2h-code-line-prefix">+</span>
737
+ <span class="d2h-code-line-ctn">newLine3</span>
738
+ </div>
739
+ </td>
740
+ </tr><tr>
741
+ <td class="d2h-code-side-linenumber d2h-cntx">
742
+ 3
743
+ </td>
744
+ <td class="d2h-cntx">
745
+ <div class="d2h-code-side-line">
746
+ <span class="d2h-code-line-prefix">\\</span>
747
+ <span class="d2h-code-line-ctn"> No newline at end of file</span>
748
+ </div>
749
+ </td>
750
+ </tr>
751
+ </tbody>
752
+ </table>
753
+ </div>
754
+ </div>
755
+ </div>
756
+ </div>
757
+ </div>"
758
+ ` ) ;
759
+ } ) ;
760
+
410
761
it ( 'should work for too big file diff' , ( ) => {
411
762
const exampleJson = [
412
763
{
0 commit comments