# Redmine - project management software # Copyright (C) 2006-2016 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. require File.expand_path('../../../../test_helper', __FILE__) class Redmine::PluginTest < ActiveSupport::TestCase def setup @klass = Redmine::Plugin # In case some real plugins are installed @klass.clear end def teardown @klass.clear end def test_register @klass.register :foo do name 'Foo plugin' url 'http://example.net/plugins/foo' author 'John Smith' author_url 'http://example.net/jsmith' description 'This is a test plugin' version '0.0.1' settings :default => {'sample_setting' => 'value', 'foo'=>'bar'}, :partial => 'foo/settings' end assert_equal 1, @klass.all.size plugin = @klass.find('foo') assert plugin.is_a?(Redmine::Plugin) assert_equal :foo, plugin.id assert_equal 'Foo plugin', plugin.name assert_equal 'http://example.net/plugins/foo', plugin.url assert_equal 'John Smith', plugin.author assert_equal 'http://example.net/jsmith', plugin.author_url assert_equal 'This is a test plugin', plugin.description assert_equal '0.0.1', plugin.version end def test_installed @klass.register(:foo) {} assert_equal true, @klass.installed?(:foo) assert_equal false, @klass.installed?(:bar) end def test_menu assert_difference 'Redmine::MenuManager.items(:project_menu).size' do @klass.register :foo do menu :project_menu, :foo_menu_item, '/foo', :caption => 'Foo' end end menu_item = Redmine::MenuManager.items(:project_menu).detect {|i| i.name == :foo_menu_item} assert_not_nil menu_item assert_equal 'Foo', menu_item.caption assert_equal '/foo', menu_item.url ensure Redmine::MenuManager.map(:project_menu).delete(:foo_menu_item) end def test_delete_menu_item Redmine::MenuManager.map(:project_menu).push(:foo_menu_item, '/foo', :caption => 'Foo') assert_difference 'Redmine::MenuManager.items(:project_menu).size', -1 do @klass.register :foo do delete_menu_item :project_menu, :foo_menu_item end end assert_nil Redmine::MenuManager.items(:project_menu).detect {|i| i.name == :foo_menu_item} ensure Redmine::MenuManager.map(:project_menu).delete(:foo_menu_item) end def test_directory_with_override @klass.register(:foo) do directory '/path/to/foo' end assert_equal '/path/to/foo', @klass.find('foo').directory end def test_directory_without_override @klass.register(:foo) {} assert_equal File.join(@klass.directory, 'foo'), @klass.find('foo').directory end def test_requires_redmine plugin = Redmine::Plugin.register(:foo) {} Redmine::VERSION.stubs(:to_a).returns([2, 1, 3, "stable", 10817]) # Specific version without hash assert plugin.requires_redmine('2.1.3') assert plugin.requires_redmine('2.1') assert_raise Redmine::PluginRequirementError do plugin.requires_redmine('2.1.4') end assert_raise Redmine::PluginRequirementError do plugin.requires_redmine('2.2') end # Specific version assert plugin.requires_redmine(:version => '2.1.3') assert plugin.requires_redmine(:version => ['2.1.3', '2.2.0']) assert plugin.requires_redmine(:version => '2.1') assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version => '2.2.0') end assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version => ['2.1.4', '2.2.0']) end assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version => '2.2') end # Version range assert plugin.requires_redmine(:version => '2.0.0'..'2.2.4') assert plugin.requires_redmine(:version => '2.1.3'..'2.2.4') assert plugin.requires_redmine(:version => '2.0.0'..'2.1.3') assert plugin.requires_redmine(:version => '2.0'..'2.2') assert plugin.requires_redmine(:version => '2.1'..'2.2') assert plugin.requires_redmine(:version => '2.0'..'2.1') assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version => '2.1.4'..'2.2.4') end # Version or higher assert plugin.requires_redmine(:version_or_higher => '0.1.0') assert plugin.requires_redmine(:version_or_higher => '2.1.3') assert plugin.requires_redmine(:version_or_higher => '2.1') assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version_or_higher => '2.2.0') end assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version_or_higher => '2.2') end end def test_requires_redmine_plugin test = self other_version = '0.5.0' @klass.register :other do name 'Other' version other_version end @klass.register :foo do test.assert requires_redmine_plugin(:other, :version_or_higher => '0.1.0') test.assert requires_redmine_plugin(:other, :version_or_higher => other_version) test.assert requires_redmine_plugin(:other, other_version) test.assert_raise Redmine::PluginRequirementError do requires_redmine_plugin(:other, :version_or_higher => '99.0.0') end test.assert requires_redmine_plugin(:other, :version => other_version) test.assert requires_redmine_plugin(:other, :version => [other_version, '99.0.0']) test.assert_raise Redmine::PluginRequirementError do requires_redmine_plugin(:other, :version => '99.0.0') end test.assert_raise Redmine::PluginRequirementError do requires_redmine_plugin(:other, :version => ['98.0.0', '99.0.0']) end # Missing plugin test.assert_raise Redmine::PluginNotFound do requires_redmine_plugin(:missing, :version_or_higher => '0.1.0') end test.assert_raise Redmine::PluginNotFound do requires_redmine_plugin(:missing, '0.1.0') end test.assert_raise Redmine::PluginNotFound do requires_redmine_plugin(:missing, :version => '0.1.0') end end end def test_settings_warns_about_possible_partial_collision @klass.register(:foo) { settings :partial => 'foo/settings' } Rails.logger.expects(:warn) @klass.register(:bar) { settings :partial => 'foo/settings' } end end p { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
import java.util.*;

class Base { }

public class GenericMethodITD6 {

  public static void main(String[] argv) {
    List<Double> as = new ArrayList<Double>();
    new Base().simple(as); // ok, Double extends Number
  }
}

class Super {}

class A extends Super {}

aspect X {
  <E extends Number> void Base.simple(List<? extends E> list) {}
}