<?xml version="1.0"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<ruleset name="Switches Rules"
         xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
	
	<description>
      The Architecture ruleset contains a collection of good practices around architecture.
	</description>
	
	<rule
		class="org.apache.flex.pmd.rules.switchrules.SwitchStatementsShouldHaveDefaultRule"
		message="A switch statement does not contain a default statement">
		<description>Switch statements should have a default label in order to detect corner cases.</description>
		<priority>1</priority>
		<example>
public class Foo 
{
   public funciton bar() : void 
   {
      var  x : int = 2;
      switch (x) 
      {
         case 2: var j : int = 8;
      }
   }
}     
      </example>
	</rule>

	<rule class="org.apache.flex.pmd.rules.switchrules.NestedSwitchRule"
		message="Switch must not be nested">
		<description>As a general practice, switch statement should not be used. Prefer using inheritance. It is even harder to read when switch statements are nested.</description>
		<priority>3</priority>
		<example>
public function foo( a : Number, b : Number ) : void
{
    switch( a )
    {
       case 1:
          break;
       case 2:                   
          switch ( b ) 
          {
            case 3 :
               break;
            case 4 :
               break;
          }
          break;                     
    }
}
      </example>
	</rule>

	<rule class="org.apache.flex.pmd.rules.switchrules.NonBreakableSwitchCaseRule"
		message="Switch case must include break statement">
		<priority>1</priority>
		<example>
switch(event.type){
  case GoogleSearchPanel.LAUNCH_GOOGLE_WEB_SEARCH:
	  googleResquest.url = ""; // VIOLATION
  case GoogleSearchPanel.LAUNCH_GOOGLE_IMAGE_SEARCH:                   
  case GoogleSearchPanel.LAUNCH_GOOGLE_IMAGE_SEARCH2:                   
	  googleResquest.url = "";
	  break;
  default:
	  return;
}
      </example>
	</rule>

	
	<rule
		class="org.apache.flex.pmd.rules.switchrules.TooFewBrancheInSwitchStatementRule"
		message="There are too few branches in this switch statement ({0} minimum, but {1} actual)">
		<description>Switch statements are designed for complex branches, and allow branches to share treatment. Using a switch for only 2 branches is ill advised, as switches are not as easy to understand as if. In this case, it's most likely is a good idea to use a if statement</description>
		<priority>5</priority>
		<properties>
			<property name="minimum">
				<value>3</value>
			</property>
		</properties>
		<example>
      </example>
	</rule>
	
	<rule class="org.apache.flex.pmd.rules.switchrules.IdenticalSwitchCasesRule"
		message="Two switch cases should not be identical">
		<priority>1</priority>
	</rule>
		
</ruleset>
