From: Kouhei S. <ko...@co...> - 2014-02-16 08:49:01
|
須藤です。 In <530...@gm...> "Re: [ruby-gnome2-devel-ja] gdk3/gtk3 3.4.x以上の機能の実装について" on Sun, 16 Feb 2014 14:33:01 +0900, hiroshi hatake <cos...@gm...> wrote: > GTK+ 3.8ではGTKの細かい修正が主で新しいウィジェットの追加はないようなの > で3.10向けの作業を開始しました。 > > 手始めにGtk::HeaderBarをmasterに直接コミットしてみました。 ありがとうございます! > Gtk::Stackのバインディング側の実装はできたのですが、 > テストコードに何かもやっとしたものを感じ、 > Ruby-GNOME2での命名規則の理解が浅そうで不安を感じたので > Gtk::Stackはmasterに直接コミットではなくPull Requestにしました。 命名規則はトップページにある http://ruby-gnome2.sourceforge.jp/#For+Developers からリンクがある http://ruby-gnome2.sourceforge.jp/hiki.cgi?How+to+Implement+Ruby-GNOME2 http://ruby-gnome2.sourceforge.jp/hiki.cgi?Naming+and+Conversion+Rules にまとまっています。 テストコードは、一般的に言うと、assert_nothing_raisedを使って いるのはだいたいちゃんとテストしていないと思っていいです。 各テストでは * ○○をしたら * △△になることを * 1つ確認 しますが、assert_nothing_raisedを使っている場合は「△△にな ることを」省略していると言えます。 例えば、test_set_add_namedを考えましょう。 https://github.com/ruby-gnome2/ruby-gnome2/pull/223/files#diff-e209d4db4a8e22d0ddf83bda95c03d69R25 def test_set_add_named widget = Gtk::EventBox.new widget_name = "set widget name" assert_nothing_raised do @stack.set_add_named(widget, widget_name) end end 「名前つきで」ウィジェットが追加される「△△になることを」に 該当します。 例えば、名前を指定して@stackからウィジェットを取得できないか と考えます。これができれば「名前つきで」ウィジェットが追加さ れているかを確認できます。ただ、 gtk_stack_get_child_by_name()は3.12からの機能なので使えそう にありません。 https://git.gnome.org/browse/gtk+/tree/gtk/gtkstack.c#n1147 しょうがないのでGTK+のソースを見てみるとプロパティとして名前 を追加していることがわかります。プロパティが設定されているこ とを確認できれば「名前つきで」ウィジェットが追加されているか を確認できそうです。 https://git.gnome.org/browse/gtk+/tree/gtk/gtkstack.c#n1045 void gtk_stack_add_named (GtkStack *stack, GtkWidget *child, const gchar *name) { g_return_if_fail (GTK_IS_STACK (stack)); g_return_if_fail (GTK_IS_WIDGET (child)); gtk_container_add_with_properties (GTK_CONTAINER (stack), child, "name", name, NULL); } (中略)gtk_widget_child_notify()というので、新しいプロパティ が設定されたという通知がいきそうだと気づきます。 https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-child-notify ということで、こんな感じで「△△になることを」確認できないで しょうか。(試していないので動かないかもしれませんが。。。) def test_set_add_named widget = Gtk::EventBox.new widget_name = "set widget name" name_is_set = false @stack.signal_connect("child-notify") do |*args| p args # 何が渡されるかわからないけど"name"プロパティが # 渡されていることを確認したい。 name_is_set = true end @stack.set_add_named(widget, widget_name) assert_true(name_is_set) end > # Gtk::Widgetの扱いや、GTKのクラス階層の理解が浅いなぁと思う今日このごろです。。。 まぁ、GTK+はたくさん機能がありますからねぇ。。。 クラス階層はドキュメントの「Object Hierarchy」セクションが役 に立つと思います。 https://developer.gnome.org/gtk3/stable/GtkStack.html#GtkStack.object-hierarchy Rubyで動かしてGtk::Stack.ancestorsとするのもアリです。 > GTK 3.10向けの作業をFedora 20でしていると、 > ついうっかりUbuntu 12.04 LTS環境でGTK 3.4より新しい環境向けコードに対して > omissionさせるのを忘れてしまった!と思うことがしばしばあります。。。 > Ubuntu環境でテストコードを動かしたり、バインディングをmakeすればなんてことはないのですが… > > # うっかりしていてTravis CIでfailureを出してしまいました、すいません。 いろんな環境で試すのが大変なのでTravis CIを使っているので、 Travis CIで問題を見つけるのは正しい使い方だと思います! なので、Travis CIで問題を見つけて修正するというのは間違って いないと思います! |