Code MCP

  • test
#!/usr/bin/env python3 import os import tempfile import unittest from expecttest import TestCase from codemcp.tools.read_file import read_file_content from codemcp.common import MAX_LINES_TO_READ, MAX_LINE_LENGTH class TestReadFile(TestCase): def setUp(self): # Create a temporary directory for test files self.temp_dir = tempfile.TemporaryDirectory() self.addCleanup(self.temp_dir.cleanup) # Create a test file with known content self.test_file_path = os.path.join(self.temp_dir.name, "test_file.txt") with open(self.test_file_path, "w") as f: for i in range(1, 101): f.write(f"This is line {i}\n") # Create a file with long lines self.long_line_file_path = os.path.join(self.temp_dir.name, "long_line_file.txt") with open(self.long_line_file_path, "w") as f: f.write("Short line\n") f.write("A" * (MAX_LINE_LENGTH + 100) + "\n") f.write("Another short line\n") # Create a large file that exceeds the line limit self.large_file_path = os.path.join(self.temp_dir.name, "large_file.txt") with open(self.large_file_path, "w") as f: for i in range(1, MAX_LINES_TO_READ + 100): f.write(f"Line {i}\n") def test_read_file_basic(self): """Test basic file reading functionality""" result = read_file_content(self.test_file_path) self.assertExpectedInline(result, """\ 1 This is line 1 2 This is line 2 3 This is line 3 4 This is line 4 5 This is line 5 6 This is line 6 7 This is line 7 8 This is line 8 9 This is line 9 10 This is line 10 11 This is line 11 12 This is line 12 13 This is line 13 14 This is line 14 15 This is line 15 16 This is line 16 17 This is line 17 18 This is line 18 19 This is line 19 20 This is line 20 21 This is line 21 22 This is line 22 23 This is line 23 24 This is line 24 25 This is line 25 26 This is line 26 27 This is line 27 28 This is line 28 29 This is line 29 30 This is line 30 31 This is line 31 32 This is line 32 33 This is line 33 34 This is line 34 35 This is line 35 36 This is line 36 37 This is line 37 38 This is line 38 39 This is line 39 40 This is line 40 41 This is line 41 42 This is line 42 43 This is line 43 44 This is line 44 45 This is line 45 46 This is line 46 47 This is line 47 48 This is line 48 49 This is line 49 50 This is line 50 51 This is line 51 52 This is line 52 53 This is line 53 54 This is line 54 55 This is line 55 56 This is line 56 57 This is line 57 58 This is line 58 59 This is line 59 60 This is line 60 61 This is line 61 62 This is line 62 63 This is line 63 64 This is line 64 65 This is line 65 66 This is line 66 67 This is line 67 68 This is line 68 69 This is line 69 70 This is line 70 71 This is line 71 72 This is line 72 73 This is line 73 74 This is line 74 75 This is line 75 76 This is line 76 77 This is line 77 78 This is line 78 79 This is line 79 80 This is line 80 81 This is line 81 82 This is line 82 83 This is line 83 84 This is line 84 85 This is line 85 86 This is line 86 87 This is line 87 88 This is line 88 89 This is line 89 90 This is line 90 91 This is line 91 92 This is line 92 93 This is line 93 94 This is line 94 95 This is line 95 96 This is line 96 97 This is line 97 98 This is line 98 99 This is line 99 100 This is line 100""") def test_read_file_with_offset(self): """Test reading a file with an offset""" result = read_file_content(self.test_file_path, offset=50) self.assertExpectedInline(result, """\ 50 This is line 50 51 This is line 51 52 This is line 52 53 This is line 53 54 This is line 54 55 This is line 55 56 This is line 56 57 This is line 57 58 This is line 58 59 This is line 59 60 This is line 60 61 This is line 61 62 This is line 62 63 This is line 63 64 This is line 64 65 This is line 65 66 This is line 66 67 This is line 67 68 This is line 68 69 This is line 69 70 This is line 70 71 This is line 71 72 This is line 72 73 This is line 73 74 This is line 74 75 This is line 75 76 This is line 76 77 This is line 77 78 This is line 78 79 This is line 79 80 This is line 80 81 This is line 81 82 This is line 82 83 This is line 83 84 This is line 84 85 This is line 85 86 This is line 86 87 This is line 87 88 This is line 88 89 This is line 89 90 This is line 90 91 This is line 91 92 This is line 92 93 This is line 93 94 This is line 94 95 This is line 95 96 This is line 96 97 This is line 97 98 This is line 98 99 This is line 99 100 This is line 100""") def test_read_file_with_limit(self): """Test reading a file with a limit""" result = read_file_content(self.test_file_path, limit=10) self.assertExpectedInline(result, """\ 1 This is line 1 2 This is line 2 3 This is line 3 4 This is line 4 5 This is line 5 6 This is line 6 7 This is line 7 8 This is line 8 9 This is line 9 10 This is line 10 ... (file truncated, showing 10 of 100 lines)""") def test_read_file_with_offset_and_limit(self): """Test reading a file with both offset and limit""" result = read_file_content(self.test_file_path, offset=50, limit=5) self.assertExpectedInline(result, """\ 50 This is line 50 51 This is line 51 52 This is line 52 53 This is line 53 54 This is line 54 ... (file truncated, showing 5 of 100 lines)""") def test_read_file_invalid_offset(self): """Test reading a file with an invalid offset""" result = read_file_content(self.test_file_path, offset=200) self.assertExpectedInline(result, """Error: Offset 200 is beyond the end of the file (total lines: 100)""") def test_read_file_nonexistent(self): """Test reading a nonexistent file""" result = read_file_content(os.path.join(self.temp_dir.name, "nonexistent.txt")) self.assertExpectedInline(result, """Error: File does not exist: /var/folders/zp/xff7r1c96vj9b2f375x9r0340000gn/T/tmpho9it_q7/nonexistent.txt""") def test_read_directory(self): """Test reading a directory instead of a file""" result = read_file_content(self.temp_dir.name) self.assertExpectedInline(result, """Error: Path is a directory, not a file: /var/folders/zp/xff7r1c96vj9b2f375x9r0340000gn/T/tmprlsqfcm8""") def test_read_file_long_lines(self): """Test reading a file with lines exceeding the maximum length""" result = read_file_content(self.long_line_file_path) self.assertExpectedInline(result, """\ 1 Short line 2 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA... (line truncated) 3 Another short line""") def test_read_large_file(self): """Test reading a large file that exceeds the line limit""" result = read_file_content(self.large_file_path) self.assertExpectedInline(result, """\ 1 Line 1 2 Line 2 3 Line 3 4 Line 4 5 Line 5 6 Line 6 7 Line 7 8 Line 8 9 Line 9 10 Line 10 11 Line 11 12 Line 12 13 Line 13 14 Line 14 15 Line 15 16 Line 16 17 Line 17 18 Line 18 19 Line 19 20 Line 20 21 Line 21 22 Line 22 23 Line 23 24 Line 24 25 Line 25 26 Line 26 27 Line 27 28 Line 28 29 Line 29 30 Line 30 31 Line 31 32 Line 32 33 Line 33 34 Line 34 35 Line 35 36 Line 36 37 Line 37 38 Line 38 39 Line 39 40 Line 40 41 Line 41 42 Line 42 43 Line 43 44 Line 44 45 Line 45 46 Line 46 47 Line 47 48 Line 48 49 Line 49 50 Line 50 51 Line 51 52 Line 52 53 Line 53 54 Line 54 55 Line 55 56 Line 56 57 Line 57 58 Line 58 59 Line 59 60 Line 60 61 Line 61 62 Line 62 63 Line 63 64 Line 64 65 Line 65 66 Line 66 67 Line 67 68 Line 68 69 Line 69 70 Line 70 71 Line 71 72 Line 72 73 Line 73 74 Line 74 75 Line 75 76 Line 76 77 Line 77 78 Line 78 79 Line 79 80 Line 80 81 Line 81 82 Line 82 83 Line 83 84 Line 84 85 Line 85 86 Line 86 87 Line 87 88 Line 88 89 Line 89 90 Line 90 91 Line 91 92 Line 92 93 Line 93 94 Line 94 95 Line 95 96 Line 96 97 Line 97 98 Line 98 99 Line 99 100 Line 100 101 Line 101 102 Line 102 103 Line 103 104 Line 104 105 Line 105 106 Line 106 107 Line 107 108 Line 108 109 Line 109 110 Line 110 111 Line 111 112 Line 112 113 Line 113 114 Line 114 115 Line 115 116 Line 116 117 Line 117 118 Line 118 119 Line 119 120 Line 120 121 Line 121 122 Line 122 123 Line 123 124 Line 124 125 Line 125 126 Line 126 127 Line 127 128 Line 128 129 Line 129 130 Line 130 131 Line 131 132 Line 132 133 Line 133 134 Line 134 135 Line 135 136 Line 136 137 Line 137 138 Line 138 139 Line 139 140 Line 140 141 Line 141 142 Line 142 143 Line 143 144 Line 144 145 Line 145 146 Line 146 147 Line 147 148 Line 148 149 Line 149 150 Line 150 151 Line 151 152 Line 152 153 Line 153 154 Line 154 155 Line 155 156 Line 156 157 Line 157 158 Line 158 159 Line 159 160 Line 160 161 Line 161 162 Line 162 163 Line 163 164 Line 164 165 Line 165 166 Line 166 167 Line 167 168 Line 168 169 Line 169 170 Line 170 171 Line 171 172 Line 172 173 Line 173 174 Line 174 175 Line 175 176 Line 176 177 Line 177 178 Line 178 179 Line 179 180 Line 180 181 Line 181 182 Line 182 183 Line 183 184 Line 184 185 Line 185 186 Line 186 187 Line 187 188 Line 188 189 Line 189 190 Line 190 191 Line 191 192 Line 192 193 Line 193 194 Line 194 195 Line 195 196 Line 196 197 Line 197 198 Line 198 199 Line 199 200 Line 200 201 Line 201 202 Line 202 203 Line 203 204 Line 204 205 Line 205 206 Line 206 207 Line 207 208 Line 208 209 Line 209 210 Line 210 211 Line 211 212 Line 212 213 Line 213 214 Line 214 215 Line 215 216 Line 216 217 Line 217 218 Line 218 219 Line 219 220 Line 220 221 Line 221 222 Line 222 223 Line 223 224 Line 224 225 Line 225 226 Line 226 227 Line 227 228 Line 228 229 Line 229 230 Line 230 231 Line 231 232 Line 232 233 Line 233 234 Line 234 235 Line 235 236 Line 236 237 Line 237 238 Line 238 239 Line 239 240 Line 240 241 Line 241 242 Line 242 243 Line 243 244 Line 244 245 Line 245 246 Line 246 247 Line 247 248 Line 248 249 Line 249 250 Line 250 251 Line 251 252 Line 252 253 Line 253 254 Line 254 255 Line 255 256 Line 256 257 Line 257 258 Line 258 259 Line 259 260 Line 260 261 Line 261 262 Line 262 263 Line 263 264 Line 264 265 Line 265 266 Line 266 267 Line 267 268 Line 268 269 Line 269 270 Line 270 271 Line 271 272 Line 272 273 Line 273 274 Line 274 275 Line 275 276 Line 276 277 Line 277 278 Line 278 279 Line 279 280 Line 280 281 Line 281 282 Line 282 283 Line 283 284 Line 284 285 Line 285 286 Line 286 287 Line 287 288 Line 288 289 Line 289 290 Line 290 291 Line 291 292 Line 292 293 Line 293 294 Line 294 295 Line 295 296 Line 296 297 Line 297 298 Line 298 299 Line 299 300 Line 300 301 Line 301 302 Line 302 303 Line 303 304 Line 304 305 Line 305 306 Line 306 307 Line 307 308 Line 308 309 Line 309 310 Line 310 311 Line 311 312 Line 312 313 Line 313 314 Line 314 315 Line 315 316 Line 316 317 Line 317 318 Line 318 319 Line 319 320 Line 320 321 Line 321 322 Line 322 323 Line 323 324 Line 324 325 Line 325 326 Line 326 327 Line 327 328 Line 328 329 Line 329 330 Line 330 331 Line 331 332 Line 332 333 Line 333 334 Line 334 335 Line 335 336 Line 336 337 Line 337 338 Line 338 339 Line 339 340 Line 340 341 Line 341 342 Line 342 343 Line 343 344 Line 344 345 Line 345 346 Line 346 347 Line 347 348 Line 348 349 Line 349 350 Line 350 351 Line 351 352 Line 352 353 Line 353 354 Line 354 355 Line 355 356 Line 356 357 Line 357 358 Line 358 359 Line 359 360 Line 360 361 Line 361 362 Line 362 363 Line 363 364 Line 364 365 Line 365 366 Line 366 367 Line 367 368 Line 368 369 Line 369 370 Line 370 371 Line 371 372 Line 372 373 Line 373 374 Line 374 375 Line 375 376 Line 376 377 Line 377 378 Line 378 379 Line 379 380 Line 380 381 Line 381 382 Line 382 383 Line 383 384 Line 384 385 Line 385 386 Line 386 387 Line 387 388 Line 388 389 Line 389 390 Line 390 391 Line 391 392 Line 392 393 Line 393 394 Line 394 395 Line 395 396 Line 396 397 Line 397 398 Line 398 399 Line 399 400 Line 400 401 Line 401 402 Line 402 403 Line 403 404 Line 404 405 Line 405 406 Line 406 407 Line 407 408 Line 408 409 Line 409 410 Line 410 411 Line 411 412 Line 412 413 Line 413 414 Line 414 415 Line 415 416 Line 416 417 Line 417 418 Line 418 419 Line 419 420 Line 420 421 Line 421 422 Line 422 423 Line 423 424 Line 424 425 Line 425 426 Line 426 427 Line 427 428 Line 428 429 Line 429 430 Line 430 431 Line 431 432 Line 432 433 Line 433 434 Line 434 435 Line 435 436 Line 436 437 Line 437 438 Line 438 439 Line 439 440 Line 440 441 Line 441 442 Line 442 443 Line 443 444 Line 444 445 Line 445 446 Line 446 447 Line 447 448 Line 448 449 Line 449 450 Line 450 451 Line 451 452 Line 452 453 Line 453 454 Line 454 455 Line 455 456 Line 456 457 Line 457 458 Line 458 459 Line 459 460 Line 460 461 Line 461 462 Line 462 463 Line 463 464 Line 464 465 Line 465 466 Line 466 467 Line 467 468 Line 468 469 Line 469 470 Line 470 471 Line 471 472 Line 472 473 Line 473 474 Line 474 475 Line 475 476 Line 476 477 Line 477 478 Line 478 479 Line 479 480 Line 480 481 Line 481 482 Line 482 483 Line 483 484 Line 484 485 Line 485 486 Line 486 487 Line 487 488 Line 488 489 Line 489 490 Line 490 491 Line 491 492 Line 492 493 Line 493 494 Line 494 495 Line 495 496 Line 496 497 Line 497 498 Line 498 499 Line 499 500 Line 500 501 Line 501 502 Line 502 503 Line 503 504 Line 504 505 Line 505 506 Line 506 507 Line 507 508 Line 508 509 Line 509 510 Line 510 511 Line 511 512 Line 512 513 Line 513 514 Line 514 515 Line 515 516 Line 516 517 Line 517 518 Line 518 519 Line 519 520 Line 520 521 Line 521 522 Line 522 523 Line 523 524 Line 524 525 Line 525 526 Line 526 527 Line 527 528 Line 528 529 Line 529 530 Line 530 531 Line 531 532 Line 532 533 Line 533 534 Line 534 535 Line 535 536 Line 536 537 Line 537 538 Line 538 539 Line 539 540 Line 540 541 Line 541 542 Line 542 543 Line 543 544 Line 544 545 Line 545 546 Line 546 547 Line 547 548 Line 548 549 Line 549 550 Line 550 551 Line 551 552 Line 552 553 Line 553 554 Line 554 555 Line 555 556 Line 556 557 Line 557 558 Line 558 559 Line 559 560 Line 560 561 Line 561 562 Line 562 563 Line 563 564 Line 564 565 Line 565 566 Line 566 567 Line 567 568 Line 568 569 Line 569 570 Line 570 571 Line 571 572 Line 572 573 Line 573 574 Line 574 575 Line 575 576 Line 576 577 Line 577 578 Line 578 579 Line 579 580 Line 580 581 Line 581 582 Line 582 583 Line 583 584 Line 584 585 Line 585 586 Line 586 587 Line 587 588 Line 588 589 Line 589 590 Line 590 591 Line 591 592 Line 592 593 Line 593 594 Line 594 595 Line 595 596 Line 596 597 Line 597 598 Line 598 599 Line 599 600 Line 600 601 Line 601 602 Line 602 603 Line 603 604 Line 604 605 Line 605 606 Line 606 607 Line 607 608 Line 608 609 Line 609 610 Line 610 611 Line 611 612 Line 612 613 Line 613 614 Line 614 615 Line 615 616 Line 616 617 Line 617 618 Line 618 619 Line 619 620 Line 620 621 Line 621 622 Line 622 623 Line 623 624 Line 624 625 Line 625 626 Line 626 627 Line 627 628 Line 628 629 Line 629 630 Line 630 631 Line 631 632 Line 632 633 Line 633 634 Line 634 635 Line 635 636 Line 636 637 Line 637 638 Line 638 639 Line 639 640 Line 640 641 Line 641 642 Line 642 643 Line 643 644 Line 644 645 Line 645 646 Line 646 647 Line 647 648 Line 648 649 Line 649 650 Line 650 651 Line 651 652 Line 652 653 Line 653 654 Line 654 655 Line 655 656 Line 656 657 Line 657 658 Line 658 659 Line 659 660 Line 660 661 Line 661 662 Line 662 663 Line 663 664 Line 664 665 Line 665 666 Line 666 667 Line 667 668 Line 668 669 Line 669 670 Line 670 671 Line 671 672 Line 672 673 Line 673 674 Line 674 675 Line 675 676 Line 676 677 Line 677 678 Line 678 679 Line 679 680 Line 680 681 Line 681 682 Line 682 683 Line 683 684 Line 684 685 Line 685 686 Line 686 687 Line 687 688 Line 688 689 Line 689 690 Line 690 691 Line 691 692 Line 692 693 Line 693 694 Line 694 695 Line 695 696 Line 696 697 Line 697 698 Line 698 699 Line 699 700 Line 700 701 Line 701 702 Line 702 703 Line 703 704 Line 704 705 Line 705 706 Line 706 707 Line 707 708 Line 708 709 Line 709 710 Line 710 711 Line 711 712 Line 712 713 Line 713 714 Line 714 715 Line 715 716 Line 716 717 Line 717 718 Line 718 719 Line 719 720 Line 720 721 Line 721 722 Line 722 723 Line 723 724 Line 724 725 Line 725 726 Line 726 727 Line 727 728 Line 728 729 Line 729 730 Line 730 731 Line 731 732 Line 732 733 Line 733 734 Line 734 735 Line 735 736 Line 736 737 Line 737 738 Line 738 739 Line 739 740 Line 740 741 Line 741 742 Line 742 743 Line 743 744 Line 744 745 Line 745 746 Line 746 747 Line 747 748 Line 748 749 Line 749 750 Line 750 751 Line 751 752 Line 752 753 Line 753 754 Line 754 755 Line 755 756 Line 756 757 Line 757 758 Line 758 759 Line 759 760 Line 760 761 Line 761 762 Line 762 763 Line 763 764 Line 764 765 Line 765 766 Line 766 767 Line 767 768 Line 768 769 Line 769 770 Line 770 771 Line 771 772 Line 772 773 Line 773 774 Line 774 775 Line 775 776 Line 776 777 Line 777 778 Line 778 779 Line 779 780 Line 780 781 Line 781 782 Line 782 783 Line 783 784 Line 784 785 Line 785 786 Line 786 787 Line 787 788 Line 788 789 Line 789 790 Line 790 791 Line 791 792 Line 792 793 Line 793 794 Line 794 795 Line 795 796 Line 796 797 Line 797 798 Line 798 799 Line 799 800 Line 800 801 Line 801 802 Line 802 803 Line 803 804 Line 804 805 Line 805 806 Line 806 807 Line 807 808 Line 808 809 Line 809 810 Line 810 811 Line 811 812 Line 812 813 Line 813 814 Line 814 815 Line 815 816 Line 816 817 Line 817 818 Line 818 819 Line 819 820 Line 820 821 Line 821 822 Line 822 823 Line 823 824 Line 824 825 Line 825 826 Line 826 827 Line 827 828 Line 828 829 Line 829 830 Line 830 831 Line 831 832 Line 832 833 Line 833 834 Line 834 835 Line 835 836 Line 836 837 Line 837 838 Line 838 839 Line 839 840 Line 840 841 Line 841 842 Line 842 843 Line 843 844 Line 844 845 Line 845 846 Line 846 847 Line 847 848 Line 848 849 Line 849 850 Line 850 851 Line 851 852 Line 852 853 Line 853 854 Line 854 855 Line 855 856 Line 856 857 Line 857 858 Line 858 859 Line 859 860 Line 860 861 Line 861 862 Line 862 863 Line 863 864 Line 864 865 Line 865 866 Line 866 867 Line 867 868 Line 868 869 Line 869 870 Line 870 871 Line 871 872 Line 872 873 Line 873 874 Line 874 875 Line 875 876 Line 876 877 Line 877 878 Line 878 879 Line 879 880 Line 880 881 Line 881 882 Line 882 883 Line 883 884 Line 884 885 Line 885 886 Line 886 887 Line 887 888 Line 888 889 Line 889 890 Line 890 891 Line 891 892 Line 892 893 Line 893 894 Line 894 895 Line 895 896 Line 896 897 Line 897 898 Line 898 899 Line 899 900 Line 900 901 Line 901 902 Line 902 903 Line 903 904 Line 904 905 Line 905 906 Line 906 907 Line 907 908 Line 908 909 Line 909 910 Line 910 911 Line 911 912 Line 912 913 Line 913 914 Line 914 915 Line 915 916 Line 916 917 Line 917 918 Line 918 919 Line 919 920 Line 920 921 Line 921 922 Line 922 923 Line 923 924 Line 924 925 Line 925 926 Line 926 927 Line 927 928 Line 928 929 Line 929 930 Line 930 931 Line 931 932 Line 932 933 Line 933 934 Line 934 935 Line 935 936 Line 936 937 Line 937 938 Line 938 939 Line 939 940 Line 940 941 Line 941 942 Line 942 943 Line 943 944 Line 944 945 Line 945 946 Line 946 947 Line 947 948 Line 948 949 Line 949 950 Line 950 951 Line 951 952 Line 952 953 Line 953 954 Line 954 955 Line 955 956 Line 956 957 Line 957 958 Line 958 959 Line 959 960 Line 960 961 Line 961 962 Line 962 963 Line 963 964 Line 964 965 Line 965 966 Line 966 967 Line 967 968 Line 968 969 Line 969 970 Line 970 971 Line 971 972 Line 972 973 Line 973 974 Line 974 975 Line 975 976 Line 976 977 Line 977 978 Line 978 979 Line 979 980 Line 980 981 Line 981 982 Line 982 983 Line 983 984 Line 984 985 Line 985 986 Line 986 987 Line 987 988 Line 988 989 Line 989 990 Line 990 991 Line 991 992 Line 992 993 Line 993 994 Line 994 995 Line 995 996 Line 996 997 Line 997 998 Line 998 999 Line 999 1000 Line 1000 ... (file truncated, showing 1000 of 1099 lines)""") if __name__ == "__main__": unittest.main()