text: package version
  
  import (
  	"strings"
  	"testing"
  )
  
  var anyConstraints = map[string][]*Constraint{
  	"*":       []*Constraint{},
  	"*.*":     []*Constraint{},
  	"*.x.*":   []*Constraint{},
  	"x.x.x.*": []*Constraint{},
  }
  
  func TestParseAnyConstraints(t *testing.T) {
  	for in, out := range anyConstraints {
  		constraint := NewConstrainGroupFromString(in)
  		if x := constraint.GetConstraints(); len(x) != 0 {
  			t.Errorf("FAIL: fromString(%v) = {%s}: want {%s}", in, x, out)
  		}
  	}
  }
  
  var simpleConstraints = map[string][]*Constraint{
  	"<>1.0.0":             []*Constraint{{"<>", "1.0.0.0"}},
  	"!=1.0.0":             []*Constraint{{"!=", "1.0.0.0"}},
  	">1.0.0":              []*Constraint{{">", "1.0.0.0"}},
  	"<1.2.3.4":            []*Constraint{{"<", "1.2.3.4-dev"}},
  	"<=1.2.3":             []*Constraint{{"<=", "1.2.3.0"}},
  	">=1.2.3":             []*Constraint{{">=", "1.2.3.0"}},
  	"=1.2.3":              []*Constraint{{"=", "1.2.3.0"}},
  	"==1.2.3":             []*Constraint{{"==", "1.2.3.0"}},
  	"1.2.3":               []*Constraint{{"=", "1.2.3.0"}},
  	"=1.0":                []*Constraint{{"=", "1.0.0.0"}},
  	"1.2.3b5":             []*Constraint{{"=", "1.2.3.0-beta5"}},
  	">= 1.2.3":            []*Constraint{{">=", "1.2.3.0"}},
  	">=dev-master":        []*Constraint{{">=", "9999999-dev"}},
  	"dev-master":          []*Constraint{{"=", "9999999-dev"}},
  	"dev-feature-a":       []*Constraint{{"=", "dev-feature-a"}},
  	"dev-some-fix":        []*Constraint{{"=", "dev-some-fix"}},
  	"dev-CAPS":            []*Constraint{{"=", "dev-CAPS"}},
  	"dev-master as 1.0.0": []*Constraint{{"=", "9999999-dev"}},
  	"<1.2.3.4-stable":     []*Constraint{{"<", "1.2.3.4"}},
  
  	"<=3.0@dev":            []*Constraint{{"<=", "3.0.0.0"}},
  	"1.0@dev":              []*Constraint{{"=", "1.0.0.0"}},                 //IgnoresStabilityFlag
  	"1.0.x-dev#abcd123":    []*Constraint{{"=", "1.0.9999999.9999999-dev"}}, //IgnoresReferenceOnDevVersion
  	"1.0.x-dev#trunk/@123": []*Constraint{{"=", "1.0.9999999.9999999-dev"}}, //IgnoresReferenceOnDevVersion
  	//"1.0#abcd123":          []string{"=", "1.0.0.0"},                 //FailsOnBadReference
  	//"1.0#trunk/@123":       []string{"=", "1.0.0.0"},                 //FailsOnBadReference
  }
  
  func TestParseConstraints(t *testing.T) {
  	for in, out := range simpleConstraints {
  		constraint := NewConstrainGroupFromString(in)
  		if x := constraint.GetConstraints(); x[0].String() != out[0].String() {
  			t.Errorf("FAIL: parseConstraints(%v) = {%s}: want {%s}", in, x, out)
  		}
  	}
  }
  
  var wildcardConstraints = map[string][]*Constraint{
  	"2.*":     []*Constraint{{">", "1.9999999.9999999.9999999"}, {"<", "2.9999999.9999999.9999999"}},
  	"20.*":    []*Constraint{{">", "19.9999999.9999999.9999999"}, {"<", "20.9999999.9999999.9999999"}},
  	"2.0.*":   []*Constraint{{">", "1.9999999.9999999.9999999"}, {"<", "2.0.9999999.9999999"}},
  	"2.2.x":   []*Constraint{{">", "2.1.9999999.9999999"}, {"<", "2.2.9999999.9999999"}},
  	"2.10.x":  []*Constraint{{">", "2.9.9999999.9999999"}, {"<", "2.10.9999999.9999999"}},
  	"2.1.3.*": []*Constraint{{">", "2.1.2.9999999"}, {"<", "2.1.3.9999999"}},
  	"0.*":     []*Constraint{{"<", "0.9999999.9999999.9999999"}},
  }
  
  func TestParseConstraintsWildcardConstraints(t *testing.T) {
  	for in, out := range wildcardConstraints {
  		constraint := NewConstrainGroupFromString(in)
  		if x := constraint.GetConstraints(); x[0].String() != out[0].String() && x[1].String() != out[1].String() {
  			t.Errorf("FAIL: parseConstraints(%v) = {%s}: want {%s}", in, x, out)
  		}
  	}
  }
  
  var tildeConstraints = map[string][]*Constraint{
  	"~1":         []*Constraint{{">=", "1.0.0.0"}, {"<", "2.0.0.0-dev"}},
  	"~1.2":       []*Constraint{{">=", "1.2.0.0"}, {"<", "2.0.0.0-dev"}},
  	"~1.2.3":     []*Constraint{{">=", "1.2.3.0"}, {"<", "1.3.0.0-dev"}},
  	"~1.2.3.4":   []*Constraint{{">=", "1.2.3.4"}, {"<", "1.2.4.0-dev"}},
  	"~1.2-beta":  []*Constraint{{">=", "1.2.0.0-beta"}, {"<", "2.0.0.0-dev"}},
  	"~1.2-b2":    []*Constraint{{">=", "1.2.0.0-beta2"}, {"<", "2.0.0.0-dev"}},
  	"~1.2-BETA2": []*Constraint{{">=", "1.2.0.0-beta2"}, {"<", "2.0.0.0-dev"}},
  	"~1.2.2-dev": []*Constraint{{">=", "1.2.2.0-dev"}, {"<", "1.3.0.0-dev"}},
  }
  
  func TestParseConstraintsTildeConstraints(t *testing.T) {
  	for in, out := range tildeConstraints {
  		constraint := NewConstrainGroupFromString(in)
  		if x := constraint.GetConstraints(); x[0].String() != out[0].String() && x[1].String() != out[1].String() {
  			t.Errorf("FAIL: parseConstraints(%v) = {%s}: want {%s}", in, x, out)
  		}
  	}
  }
  
  var multiConstraints = map[string][]*Constraint{
  	">2.0,<=3.0":            []*Constraint{{">", "2.0.0.0"}, {"<=", "3.0.0.0"}},
  	">2.0@stable,<=3.0@dev": []*Constraint{{">", "2.0.0.0"}, {"<=", "3.0.0.0-dev"}},
  }
  
  func TestParseConstraintsMultiConstraints(t *testing.T) {
  	for in, out := range multiConstraints {
  		constraint := NewConstrainGroupFromString(in)
  		if x := constraint.GetConstraints(); x[0].String() != out[0].String() && x[1].String() != out[1].String() {
  			t.Errorf("FAIL: parseConstraints(%v) = {%s}: want {%s}", in, x, out)
  		}
  	}
  }
  
  var miscConstraints = map[string]bool{
  	"*|1.0":                   true,
  	">2.0,<=3.0|2.5.0beta":    true,
  	">2.0,<=3.0|3.5.0beta":    false,
  	">=2.2.3,<2.4-dev|2.3.3":  true,
  	"~1.2.3|1.2.3.5":          true,
  	"~1.2.3|1.4.3.5":          false,
  	"2.0.*|2.0.5":             true,
  	"2.0.*|2.1.5":             false,
  	"2.0.5|2.0.5":             true,
  	"2.0.5|2.0.9":             false,
  	">2.0.5|2.0.9":            true,
  	"<2.0.5|2.0.9":            false,
  	">=dev-master|dev-master": true,
  }
  
  func TestMatch(t *testing.T) {
  	for in, out := range miscConstraints {
  		tmp := strings.Split(in, "|")
  
  		constraint := NewConstrainGroupFromString(tmp[0])
  		if x := constraint.Match(tmp[1]); x != out {
  			t.Errorf("FAIL: Match(%v) = {%s}: want {%s}", in, x, out)
  		}
  	}
  }
  
  func TestAddConstraint(t *testing.T) {
  	group := NewConstrainGroup()
  	group.AddConstraint(NewConstrain("=", "1.0.0"))
  
  	constraints := group.GetConstraints()
  	if x := constraints[0].GetOperator(); x != "=" {
  		t.Errorf("FAIL: AddConstraintOperator() = {%s}: want {%s}", x, "=")
  	}
  
  	if x := constraints[0].GetVersion(); x != "1.0.0" {
  		t.Errorf("FAIL: AddConstraintVersion() = {%s}: want {%s}", x, "1.0.0")
  	}
  }
  