glib2 0.90.7 → 0.90.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/ChangeLog +68 -0
  2. data/ext/glib2/rbglib.c +51 -15
  3. data/ext/glib2/rbglib.h +10 -2
  4. data/ext/glib2/rbglib_bookmarkfile.c +37 -74
  5. data/ext/glib2/rbglib_completion.c +8 -16
  6. data/ext/glib2/rbglib_convert.c +8 -18
  7. data/ext/glib2/rbglib_error.c +2 -8
  8. data/ext/glib2/rbglib_i18n.c +1 -2
  9. data/ext/glib2/rbglib_iochannel.c +81 -127
  10. data/ext/glib2/rbglib_keyfile.c +38 -86
  11. data/ext/glib2/rbglib_maincontext.c +29 -64
  12. data/ext/glib2/rbglib_mainloop.c +4 -8
  13. data/ext/glib2/rbglib_messages.c +7 -17
  14. data/ext/glib2/rbglib_pollfd.c +7 -14
  15. data/ext/glib2/rbglib_shell.c +3 -6
  16. data/ext/glib2/rbglib_source.c +14 -28
  17. data/ext/glib2/rbglib_spawn.c +7 -14
  18. data/ext/glib2/rbglib_threads.c +2 -4
  19. data/ext/glib2/rbglib_timer.c +7 -14
  20. data/ext/glib2/rbglib_unicode.c +45 -16
  21. data/ext/glib2/rbglib_utils.c +25 -50
  22. data/ext/glib2/rbglib_win32.c +10 -17
  23. data/ext/glib2/rbgobj_boxed.c +9 -21
  24. data/ext/glib2/rbgobj_closure.c +5 -11
  25. data/ext/glib2/rbgobj_enums.c +1 -2
  26. data/ext/glib2/rbgobj_object.c +23 -59
  27. data/ext/glib2/rbgobj_param.c +7 -15
  28. data/ext/glib2/rbgobj_signal.c +25 -65
  29. data/ext/glib2/rbgobj_type.c +36 -81
  30. data/ext/glib2/rbgobj_typeinstance.c +3 -6
  31. data/ext/glib2/rbgobj_typeinterface.c +3 -6
  32. data/ext/glib2/rbgobj_typemodule.c +4 -8
  33. data/ext/glib2/rbgobj_typeplugin.c +2 -4
  34. data/ext/glib2/rbgobj_valuetypes.c +7 -15
  35. data/ext/glib2/rbgobject.c +8 -18
  36. data/ext/glib2/rbgobject.h +3 -0
  37. data/ext/glib2/rbgprivate.h +0 -1
  38. data/ext/glib2/rbgutil.c +3 -6
  39. data/lib/gnome2-raketask.rb +1 -0
  40. data/lib/mkmf-gnome2.rb +12 -9
  41. data/test-unit/History.txt +43 -1
  42. data/test-unit/Manifest.txt +1 -1
  43. data/test-unit/html/index.html +62 -24
  44. data/test-unit/html/index.html.ja +54 -25
  45. data/test-unit/html/test-unit.css +3 -3
  46. data/test-unit/lib/test/unit/assertions.rb +489 -36
  47. data/test-unit/lib/test/unit/autorunner.rb +40 -0
  48. data/test-unit/lib/test/unit/collector.rb +6 -4
  49. data/test-unit/lib/test/unit/collector/load.rb +48 -5
  50. data/test-unit/lib/test/unit/collector/xml.rb +250 -0
  51. data/test-unit/lib/test/unit/error.rb +4 -3
  52. data/test-unit/lib/test/unit/fixture.rb +12 -3
  53. data/test-unit/lib/test/unit/runner/xml.rb +15 -0
  54. data/test-unit/lib/test/unit/testcase.rb +48 -16
  55. data/test-unit/lib/test/unit/testresult.rb +6 -2
  56. data/test-unit/lib/test/unit/testsuite.rb +24 -2
  57. data/test-unit/lib/test/unit/ui/console/testrunner.rb +65 -28
  58. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +11 -2
  59. data/test-unit/lib/test/unit/ui/xml/testrunner.rb +224 -0
  60. data/test-unit/lib/test/unit/version.rb +1 -1
  61. data/test-unit/test/run-test.rb +7 -0
  62. data/test-unit/test/{test_assertions.rb → test-assertions.rb} +708 -77
  63. data/test-unit/test/test-fixture.rb +37 -0
  64. data/test-unit/test/test-testcase.rb +24 -7
  65. data/test-unit/test/test_testsuite.rb +19 -11
  66. data/test/test_iochannel.rb +9 -9
  67. data/test/test_unicode.rb +44 -31
  68. metadata +8 -9
  69. data/ext/glib2/Makefile +0 -169
  70. data/ext/glib2/glib-enum-types.c +0 -1065
  71. data/ext/glib2/glib-enum-types.h +0 -144
  72. data/ext/glib2/ruby-glib2.pc +0 -3
@@ -300,14 +300,14 @@ pre.code
300
300
  padding: 5px 10px;
301
301
  }
302
302
 
303
- img.eye-catch
303
+ div.eye-catch
304
304
  {
305
305
  float: right;
306
306
  }
307
307
 
308
- dl.feature-list
308
+ div.eye-catch img
309
309
  {
310
- clear: both;
310
+ display: block;
311
311
  }
312
312
 
313
313
  dl.feature-list dd
@@ -45,7 +45,7 @@ module Test
45
45
  # end
46
46
 
47
47
  public
48
- def assert_block(message="assert_block failed.") # :yields:
48
+ def assert_block(message="assert_block failed.") # :yields:
49
49
  _wrap_assertion do
50
50
  if (! yield)
51
51
  raise AssertionFailedError.new(message.to_s)
@@ -62,8 +62,19 @@ module Test
62
62
  public
63
63
  def assert(boolean, message=nil)
64
64
  _wrap_assertion do
65
- assert_block("assert should not be called with a block.") { !block_given? }
66
- assert_block(build_message(message, "<?> is not true.", boolean)) { boolean }
65
+ case message
66
+ when nil, String, Proc
67
+ else
68
+ error_message = "assertion message must be String or Proc: "
69
+ error_message << "<#{message.inspect}>(<#{message.class}>)"
70
+ raise ArgumentError, error_message, filter_backtrace(caller)
71
+ end
72
+ assert_block("assert should not be called with a block.") do
73
+ !block_given?
74
+ end
75
+ assert_block(build_message(message, "<?> is not true.", boolean)) do
76
+ boolean
77
+ end
67
78
  end
68
79
  end
69
80
 
@@ -297,6 +308,31 @@ EOT
297
308
  end
298
309
  end
299
310
 
311
+ ##
312
+ # Passes if +object+ does not .respond_to? +method+.
313
+ #
314
+ # Example:
315
+ # assert_not_respond_to('bugbear', :nonexistence) # -> pass
316
+ # assert_not_respond_to('bugbear', :size) # -> fail
317
+
318
+ public
319
+ def assert_not_respond_to(object, method, message="")
320
+ _wrap_assertion do
321
+ full_message = build_message(message,
322
+ "<?>.kind_of\\?(Symbol) or\n" +
323
+ "<?>.respond_to\\?(:to_str) expected",
324
+ method, method)
325
+ assert_block(full_message) do
326
+ method.kind_of?(Symbol) or method.respond_to?(:to_str)
327
+ end
328
+ full_message = build_message(message,
329
+ "!<?>.respond_to\\?(?) expected\n" +
330
+ "(Class: <?>)",
331
+ object, method, object.class)
332
+ assert_block(full_message) {!object.respond_to?(method)}
333
+ end
334
+ end
335
+
300
336
  ##
301
337
  # Passes if +string+ =~ +pattern+.
302
338
  #
@@ -444,25 +480,49 @@ EOT
444
480
  end
445
481
 
446
482
  ##
447
- # Passes if +regexp+ !~ +string+
483
+ # Passes if +regexp+ !~ +string+
448
484
  #
449
485
  # Example:
450
- # assert_no_match(/two/, 'one 2 three')
486
+ # assert_not_match(/two/, 'one 2 three') # -> pass
487
+ # assert_not_match(/three/, 'one 2 three') # -> fail
451
488
 
452
489
  public
453
- def assert_no_match(regexp, string, message="")
490
+ def assert_not_match(regexp, string, message="")
454
491
  _wrap_assertion do
455
- assert_instance_of(Regexp, regexp, "The first argument to assert_no_match should be a Regexp.")
456
- full_message = build_message(message, "<?> expected to not match\n<?>.", regexp, string)
492
+ assert_instance_of(Regexp, regexp,
493
+ "<REGEXP> in assert_not_match(<REGEXP>, ...) " +
494
+ "should be a Regexp.")
495
+ full_message = build_message(message,
496
+ "<?> expected to not match\n<?>.",
497
+ regexp, string)
457
498
  assert_block(full_message) { regexp !~ string }
458
499
  end
459
500
  end
460
501
 
502
+ ##
503
+ # Deprecated. Use #assert_not_match instead.
504
+ #
505
+ # Passes if +regexp+ !~ +string+
506
+ #
507
+ # Example:
508
+ # assert_no_match(/two/, 'one 2 three') # -> pass
509
+ # assert_no_match(/three/, 'one 2 three') # -> fail
510
+
511
+ public
512
+ def assert_no_match(regexp, string, message="")
513
+ _wrap_assertion do
514
+ assert_instance_of(Regexp, regexp,
515
+ "The first argument to assert_no_match " +
516
+ "should be a Regexp.")
517
+ assert_not_match(regexp, string, message)
518
+ end
519
+ end
520
+
461
521
  UncaughtThrow = {
462
- NameError => /^uncaught throw \`(.+)\'$/,
522
+ NameError => /^uncaught throw \`(.+)\'$/, #`
463
523
  ArgumentError => /^uncaught throw (.+)$/,
464
- ThreadError => /^uncaught throw \`(.+)\' in thread /
465
- } #`
524
+ ThreadError => /^uncaught throw \`(.+)\' in thread / #`
525
+ }
466
526
 
467
527
  ##
468
528
  # Passes if the block throws +expected_object+
@@ -550,7 +610,7 @@ EOT
550
610
  # assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
551
611
 
552
612
  public
553
- def assert_in_delta(expected_float, actual_float, delta, message="")
613
+ def assert_in_delta(expected_float, actual_float, delta=0.001, message="")
554
614
  _wrap_assertion do
555
615
  _assert_in_delta_validate_arguments(expected_float,
556
616
  actual_float,
@@ -565,6 +625,31 @@ EOT
565
625
  end
566
626
  end
567
627
 
628
+ ##
629
+ # Passes if +expected_float+ and +actual_float+ are
630
+ # not equal within +delta+ tolerance.
631
+ #
632
+ # Example:
633
+ # assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00002) # -> pass
634
+ # assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00001) # -> fail
635
+
636
+ public
637
+ def assert_not_in_delta(expected_float, actual_float, delta=0.001, message="")
638
+ _wrap_assertion do
639
+ _assert_in_delta_validate_arguments(expected_float,
640
+ actual_float,
641
+ delta)
642
+ full_message = _assert_in_delta_message(expected_float,
643
+ actual_float,
644
+ delta,
645
+ message,
646
+ :negative_assertion => true)
647
+ assert_block(full_message) do
648
+ (expected_float.to_f - actual_float.to_f).abs > delta.to_f
649
+ end
650
+ end
651
+ end
652
+
568
653
  # :stopdoc:
569
654
  private
570
655
  def _assert_in_delta_validate_arguments(expected_float,
@@ -584,26 +669,40 @@ EOT
584
669
  end
585
670
 
586
671
  def _assert_in_delta_message(expected_float, actual_float, delta,
587
- message)
588
- format = <<-EOT
589
- <?> expected but was
590
- <?> (tolerance <?>).
672
+ message, options={})
673
+ if options[:negative_assertion]
674
+ format = <<-EOT
675
+ <?> -/+ <?> expected to not include
676
+ <?>.
677
+ EOT
678
+ else
679
+ format = <<-EOT
680
+ <?> -/+ <?> expected to include
681
+ <?>.
591
682
  EOT
592
- arguments = [expected_float, actual_float, delta]
683
+ end
684
+ arguments = [expected_float, delta, actual_float]
593
685
  normalized_expected = expected_float.to_f
594
686
  normalized_actual = actual_float.to_f
595
687
  normalized_delta = delta.to_f
596
688
  relation_format = nil
597
689
  relation_arguments = nil
598
690
  if normalized_actual < normalized_expected - normalized_delta
599
- relation_format = "<<?> < <?>-<?>(?) <= <?>+<?>(?)>"
691
+ relation_format = "<<?> < <?>-<?>[?] <= <?>+<?>[?]>"
600
692
  relation_arguments = [actual_float,
601
693
  expected_float, delta,
602
694
  normalized_expected - normalized_delta,
603
695
  expected_float, delta,
604
696
  normalized_expected + normalized_delta]
605
- elsif normalized_expected - normalized_delta < normalized_actual
606
- relation_format = "<<?>-<?>(?) <= <?>+<?>(?) < <?>>"
697
+ elsif normalized_actual <= normalized_expected + normalized_delta
698
+ relation_format = "<<?>-<?>[?] <= <?> <= <?>+<?>[?]>"
699
+ relation_arguments = [expected_float, delta,
700
+ normalized_expected - normalized_delta,
701
+ actual_float,
702
+ expected_float, delta,
703
+ normalized_expected + normalized_delta]
704
+ else
705
+ relation_format = "<<?>-<?>[?] <= <?>+<?>[?] < <?>>"
607
706
  relation_arguments = [expected_float, delta,
608
707
  normalized_expected - normalized_delta,
609
708
  expected_float, delta,
@@ -622,6 +721,142 @@ EOT
622
721
 
623
722
  build_message(message, format, *arguments)
624
723
  end
724
+
725
+ public
726
+ # :startdoc:
727
+
728
+ ##
729
+ # Passes if +expected_float+ and +actual_float+ are equal
730
+ # within +epsilon+ relative error of +expected_float+.
731
+ #
732
+ # Example:
733
+ # assert_in_epsilon(10000.0, 9900.0, 0.1) # -> pass
734
+ # assert_in_epsilon(10000.0, 9899.0, 0.1) # -> fail
735
+
736
+ public
737
+ def assert_in_epsilon(expected_float, actual_float, epsilon=0.001,
738
+ message="")
739
+ _wrap_assertion do
740
+ _assert_in_epsilon_validate_arguments(expected_float,
741
+ actual_float,
742
+ epsilon)
743
+ full_message = _assert_in_epsilon_message(expected_float,
744
+ actual_float,
745
+ epsilon,
746
+ message)
747
+ assert_block(full_message) do
748
+ normalized_expected_float = expected_float.to_f
749
+ delta = normalized_expected_float * epsilon.to_f
750
+ (normalized_expected_float - actual_float.to_f).abs <= delta
751
+ end
752
+ end
753
+ end
754
+
755
+ ##
756
+ # Passes if +expected_float+ and +actual_float+ are
757
+ # not equal within +epsilon+ relative error of
758
+ # +expected_float+.
759
+ #
760
+ # Example:
761
+ # assert_not_in_epsilon(10000.0, 9900.0, 0.1) # -> fail
762
+ # assert_not_in_epsilon(10000.0, 9899.0, 0.1) # -> pass
763
+
764
+ public
765
+ def assert_not_in_epsilon(expected_float, actual_float, epsilon=0.001,
766
+ message="")
767
+ _wrap_assertion do
768
+ _assert_in_epsilon_validate_arguments(expected_float,
769
+ actual_float,
770
+ epsilon)
771
+ full_message = _assert_in_epsilon_message(expected_float,
772
+ actual_float,
773
+ epsilon,
774
+ message,
775
+ :negative_assertion => true)
776
+ assert_block(full_message) do
777
+ normalized_expected_float = expected_float.to_f
778
+ delta = normalized_expected_float * epsilon.to_f
779
+ (normalized_expected_float - actual_float.to_f).abs > delta
780
+ end
781
+ end
782
+ end
783
+
784
+ # :stopdoc:
785
+ private
786
+ def _assert_in_epsilon_validate_arguments(expected_float,
787
+ actual_float,
788
+ epsilon)
789
+ {
790
+ expected_float => "first float",
791
+ actual_float => "second float",
792
+ epsilon => "epsilon"
793
+ }.each do |float, name|
794
+ assert_respond_to(float, :to_f,
795
+ "The arguments must respond to to_f; " +
796
+ "the #{name} did not")
797
+ end
798
+ epsilon = epsilon.to_f
799
+ assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
800
+ end
801
+
802
+ def _assert_in_epsilon_message(expected_float, actual_float, epsilon,
803
+ message, options={})
804
+ normalized_expected = expected_float.to_f
805
+ normalized_actual = actual_float.to_f
806
+ normalized_epsilon = epsilon.to_f
807
+ delta = normalized_expected * normalized_epsilon
808
+
809
+ if options[:negative_assertion]
810
+ format = <<-EOT
811
+ <?> -/+ (<?> * <?>)[?] expected to not include
812
+ <?>.
813
+ EOT
814
+ else
815
+ format = <<-EOT
816
+ <?> -/+ (<?> * <?>)[?] expected to include
817
+ <?>.
818
+ EOT
819
+ end
820
+ arguments = [expected_float, expected_float, epsilon, delta,
821
+ actual_float]
822
+
823
+ relation_format = nil
824
+ relation_arguments = nil
825
+ if normalized_actual < normalized_expected - delta
826
+ relation_format = "<<?> < <?>-(<?>*<?>)[?] <= <?>+(<?>*<?>)[?]>"
827
+ relation_arguments = [actual_float,
828
+ expected_float, expected_float, epsilon,
829
+ normalized_expected - delta,
830
+ expected_float, expected_float, epsilon,
831
+ normalized_expected + delta]
832
+ elsif normalized_actual <= normalized_expected + delta
833
+ relation_format = "<<?>-(<?>*<?>)[?] <= <?> <= <?>+(<?>*<?>)[?]>"
834
+ relation_arguments = [expected_float, expected_float, epsilon,
835
+ normalized_expected - delta,
836
+ actual_float,
837
+ expected_float, expected_float, epsilon,
838
+ normalized_expected + delta]
839
+ else
840
+ relation_format = "<<?>-(<?>*<?>)[?] <= <?>+(<?>*<?>)[?] < <?>>"
841
+ relation_arguments = [expected_float, expected_float, epsilon,
842
+ normalized_expected - delta,
843
+ expected_float, expected_float, epsilon,
844
+ normalized_expected + delta,
845
+ actual_float]
846
+ end
847
+
848
+ if relation_format
849
+ format << <<-EOT
850
+
851
+ Relation:
852
+ #{relation_format}
853
+ EOT
854
+ arguments.concat(relation_arguments)
855
+ end
856
+
857
+ build_message(message, format, *arguments)
858
+ end
859
+
625
860
  public
626
861
  # :startdoc:
627
862
 
@@ -634,18 +869,76 @@ EOT
634
869
  # * Arguments to the method
635
870
  #
636
871
  # Example:
637
- # assert_send [[1, 2], :include?, 4]
872
+ # assert_send([[1, 2], :member?, 1]) # -> pass
873
+ # assert_send([[1, 2], :member?, 4]) # -> fail
638
874
 
639
875
  public
640
- def assert_send(send_array, message="")
876
+ def assert_send(send_array, message=nil)
641
877
  _wrap_assertion do
642
- assert_instance_of(Array, send_array, "assert_send requires an array of send information")
643
- assert(send_array.size >= 2, "assert_send requires at least a receiver and a message name")
644
- full_message = build_message(message, <<EOT, send_array[0], AssertionMessage.literal(send_array[1].to_s), send_array[2..-1])
878
+ assert_instance_of(Array, send_array,
879
+ "assert_send requires an array " +
880
+ "of send information")
881
+ assert_operator(send_array.size, :>=, 2,
882
+ "assert_send requires at least a receiver " +
883
+ "and a message name")
884
+ format = <<EOT
645
885
  <?> expected to respond to
646
- <?(?)> with a true value.
886
+ <?(*?)> with a true value but was
887
+ <?>.
647
888
  EOT
648
- assert_block(full_message) { send_array[0].__send__(send_array[1], *send_array[2..-1]) }
889
+ receiver, message_name, *arguments = send_array
890
+ result = nil
891
+ full_message =
892
+ build_message(message,
893
+ format,
894
+ receiver,
895
+ AssertionMessage.literal(message_name.to_s),
896
+ arguments,
897
+ AssertionMessage.delayed_literal {result})
898
+ assert_block(full_message) do
899
+ result = receiver.__send__(message_name, *arguments)
900
+ result
901
+ end
902
+ end
903
+ end
904
+
905
+ ##
906
+ # Passes if the method send doesn't return a true value.
907
+ #
908
+ # +send_array+ is composed of:
909
+ # * A receiver
910
+ # * A method
911
+ # * Arguments to the method
912
+ #
913
+ # Example:
914
+ # assert_not_send([[1, 2], :member?, 1]) # -> fail
915
+ # assert_not_send([[1, 2], :member?, 4]) # -> pass
916
+ def assert_not_send(send_array, message=nil)
917
+ _wrap_assertion do
918
+ assert_instance_of(Array, send_array,
919
+ "assert_not_send requires an array " +
920
+ "of send information")
921
+ assert_operator(send_array.size, :>=, 2,
922
+ "assert_not_send requires at least a receiver " +
923
+ "and a message name")
924
+ format = <<EOT
925
+ <?> expected to respond to
926
+ <?(*?)> with not a true value but was
927
+ <?>.
928
+ EOT
929
+ receiver, message_name, *arguments = send_array
930
+ result = nil
931
+ full_message =
932
+ build_message(message,
933
+ format,
934
+ receiver,
935
+ AssertionMessage.literal(message_name.to_s),
936
+ arguments,
937
+ AssertionMessage.delayed_literal {result})
938
+ assert_block(full_message) do
939
+ result = receiver.__send__(message_name, *arguments)
940
+ not result
941
+ end
649
942
  end
650
943
  end
651
944
 
@@ -828,7 +1121,7 @@ EOT
828
1121
  end
829
1122
 
830
1123
  ##
831
- # Passes if +object+.+predicate+
1124
+ # Passes if +object+.+predicate+ is _true_.
832
1125
  #
833
1126
  # Example:
834
1127
  # assert_predicate([], :empty?) # -> pass
@@ -850,7 +1143,7 @@ EOT
850
1143
  end
851
1144
 
852
1145
  ##
853
- # Passes if +object+.+predicate+
1146
+ # Passes if +object+.+predicate+ is not _true_.
854
1147
  #
855
1148
  # Example:
856
1149
  # assert_not_predicate([1], :empty?) # -> pass
@@ -955,6 +1248,96 @@ EOT
955
1248
  end
956
1249
  end
957
1250
 
1251
+ ##
1252
+ # Passes if +collection+ includes +object+.
1253
+ #
1254
+ # Example:
1255
+ # assert_include([1, 10], 1) # -> pass
1256
+ # assert_include(1..10, 5) # -> pass
1257
+ # assert_include([1, 10], 5) # -> fail
1258
+ # assert_include(1..10, 20) # -> fail
1259
+ def assert_include(collection, object, message=nil)
1260
+ _wrap_assertion do
1261
+ assert_respond_to(collection, :include?,
1262
+ "The collection must respond to :include?.")
1263
+ full_message = build_message(message,
1264
+ "<?> expected to include\n<?>.",
1265
+ collection,
1266
+ object)
1267
+ assert_block(full_message) do
1268
+ collection.include?(object)
1269
+ end
1270
+ end
1271
+ end
1272
+
1273
+ ##
1274
+ # Passes if +collection+ doesn't include +object+.
1275
+ #
1276
+ # Example:
1277
+ # assert_not_include([1, 10], 5) # -> pass
1278
+ # assert_not_include(1..10, 20) # -> pass
1279
+ # assert_not_include([1, 10], 1) # -> fail
1280
+ # assert_not_include(1..10, 5) # -> fail
1281
+ def assert_not_include(collection, object, message=nil)
1282
+ _wrap_assertion do
1283
+ assert_respond_to(collection, :include?,
1284
+ "The collection must respond to :include?.")
1285
+ full_message = build_message(message,
1286
+ "<?> expected to not include\n<?>.",
1287
+ collection,
1288
+ object)
1289
+ assert_block(full_message) do
1290
+ not collection.include?(object)
1291
+ end
1292
+ end
1293
+ end
1294
+
1295
+ ##
1296
+ # Passes if +object+ is empty.
1297
+ #
1298
+ # Example:
1299
+ # assert_empty("") # -> pass
1300
+ # assert_empty([]) # -> pass
1301
+ # assert_empty({}) # -> pass
1302
+ # assert_empty(" ") # -> fail
1303
+ # assert_empty([nil]) # -> fail
1304
+ # assert_empty({1 => 2}) # -> fail
1305
+ def assert_empty(object, message=nil)
1306
+ _wrap_assertion do
1307
+ assert_respond_to(object, :empty?,
1308
+ "The object must respond to :empty?.")
1309
+ full_message = build_message(message,
1310
+ "<?> expected to be empty.",
1311
+ object)
1312
+ assert_block(full_message) do
1313
+ object.empty?
1314
+ end
1315
+ end
1316
+ end
1317
+
1318
+ ##
1319
+ # Passes if +object+ is not empty.
1320
+ #
1321
+ # Example:
1322
+ # assert_not_empty(" ") # -> pass
1323
+ # assert_not_empty([nil]) # -> pass
1324
+ # assert_not_empty({1 => 2}) # -> pass
1325
+ # assert_not_empty("") # -> fail
1326
+ # assert_not_empty([]) # -> fail
1327
+ # assert_not_empty({}) # -> fail
1328
+ def assert_not_empty(object, message=nil)
1329
+ _wrap_assertion do
1330
+ assert_respond_to(object, :empty?,
1331
+ "The object must respond to :empty?.")
1332
+ full_message = build_message(message,
1333
+ "<?> expected to not be empty.",
1334
+ object)
1335
+ assert_block(full_message) do
1336
+ not object.empty?
1337
+ end
1338
+ end
1339
+ end
1340
+
958
1341
  ##
959
1342
  # Builds a failure message. +head+ is added before the +template+ and
960
1343
  # +arguments+ replaces the '?'s positionally in the template.
@@ -966,21 +1349,21 @@ EOT
966
1349
  end
967
1350
 
968
1351
  private
969
- def _wrap_assertion
1352
+ def _wrap_assertion(&block)
970
1353
  @_assertion_wrapped ||= false
971
- unless (@_assertion_wrapped)
1354
+ if @_assertion_wrapped
1355
+ block.call
1356
+ else
972
1357
  @_assertion_wrapped = true
973
1358
  begin
974
1359
  add_assertion
975
- return yield
1360
+ block.call
976
1361
  ensure
977
1362
  @_assertion_wrapped = false
978
1363
  end
979
- else
980
- return yield
981
1364
  end
982
1365
  end
983
-
1366
+
984
1367
  ##
985
1368
  # Called whenever an assertion is made. Define this in classes that
986
1369
  # include Test::Unit::Assertions to record assertion counts.
@@ -1067,6 +1450,14 @@ EOT
1067
1450
  end
1068
1451
  end
1069
1452
 
1453
+ def ensure_diffable_string(string)
1454
+ if string.respond_to?(:encoding) and
1455
+ !string.encoding.ascii_compatible?
1456
+ string = string.dup.force_encoding("ASCII-8BIT")
1457
+ end
1458
+ string
1459
+ end
1460
+
1070
1461
  def prepare_for_diff(from, to)
1071
1462
  if !from.is_a?(String) or !to.is_a?(String)
1072
1463
  from = convert(from)
@@ -1074,6 +1465,8 @@ EOT
1074
1465
  end
1075
1466
 
1076
1467
  if diff_target_string?(from) and diff_target_string?(to)
1468
+ from = ensure_diffable_string(from)
1469
+ to = ensure_diffable_string(to)
1077
1470
  [from, to]
1078
1471
  else
1079
1472
  [nil, nil]
@@ -1117,8 +1510,13 @@ EOM
1117
1510
  if use_pp
1118
1511
  begin
1119
1512
  require 'pp' unless defined?(PP)
1513
+ if HashInspector.target?(object)
1514
+ pp_target = HashInspector.new(object)
1515
+ else
1516
+ pp_target = object
1517
+ end
1120
1518
  begin
1121
- return PP.pp(object, '').chomp
1519
+ return PP.pp(pp_target, '').chomp
1122
1520
  rescue NameError
1123
1521
  end
1124
1522
  rescue LoadError
@@ -1130,6 +1528,61 @@ EOM
1130
1528
  end
1131
1529
  end
1132
1530
 
1531
+ class HashInspector
1532
+ class << self
1533
+ def target?(object)
1534
+ object.is_a?(Hash) or object == ENV
1535
+ end
1536
+
1537
+ def normalize(object)
1538
+ if target?(object)
1539
+ new(object)
1540
+ else
1541
+ object
1542
+ end
1543
+ end
1544
+ end
1545
+
1546
+ def initialize(hash)
1547
+ @hash = hash
1548
+ end
1549
+
1550
+ def inspect
1551
+ @hash.inspect
1552
+ end
1553
+
1554
+ def pretty_print(q)
1555
+ q.group(1, '{', '}') do
1556
+ q.seplist(self, nil, :each_pair) do |k, v|
1557
+ q.group do
1558
+ q.pp(k)
1559
+ q.text('=>')
1560
+ q.group(1) do
1561
+ q.breakable('')
1562
+ q.pp(v)
1563
+ end
1564
+ end
1565
+ end
1566
+ end
1567
+ end
1568
+
1569
+ def pretty_print_cycle(q)
1570
+ q.text(@hash.empty? ? '{}' : '{...}')
1571
+ end
1572
+
1573
+ def each_pair
1574
+ keys = @hash.keys
1575
+ begin
1576
+ keys = keys.sort # FIXME: more cleverly
1577
+ rescue ArgumentError
1578
+ end
1579
+ keys.each do |key|
1580
+ yield(self.class.normalize(key),
1581
+ self.class.normalize(@hash[key]))
1582
+ end
1583
+ end
1584
+ end
1585
+
1133
1586
  class Literal
1134
1587
  def initialize(value)
1135
1588
  @value = value