okami.mom/ultraviolet
git clone https://git.nkp.pet/okami.mom/ultraviolet
2c67e98
upstream
1package casso 2 3import "testing" 4 5func assertEqual (t * testing.T ,expected ,actual float64 ) { 6t .Helper () 7 8if expected != actual { 9t .Errorf ("expected %v, got %v" ,expected ,actual ) 10 } 11} 12 13func assertNoError (t * testing.T ,err error ) { 14t .Helper () 15 16if err != nil { 17t .Fatalf ("unexpected error: %v" ,err ) 18 } 19} 20 21func TestSymbol (t * testing.T ) { 22v := next (external ) 23if v .isZero () { 24t .Fatal ("external symbol should not be zero" ) 25 } 26if v .kind ()!= external { 27t .Fatalf ("expected external, got %v" ,v .kind ()) 28 } 29 30v = next (slack ) 31if v .isZero () { 32t .Fatal ("slack symbol should not be zero" ) 33 } 34if v .kind ()!= slack { 35t .Fatalf ("expected slack, got %v" ,v .kind ()) 36 } 37 38v = next (errorSym ) 39if v .isZero () { 40t .Fatal ("error symbol should not be zero" ) 41 } 42if v .kind ()!= errorSym { 43t .Fatalf ("expected errorSym, got %v" ,v .kind ()) 44 } 45 46v = next (dummy ) 47if v .isZero () { 48t .Fatal ("dummy symbol should not be zero" ) 49 } 50if v .kind ()!= dummy { 51t .Fatalf ("expected dummy, got %v" ,v .kind ()) 52 } 53} 54 55func TestConstraint (t * testing.T ) { 56l := New () 57m := New () 58r := New () 59 60a := NewConstraint (EQ ,0 ,r .T (1 ),l .T (1 ),m .T (- 2 )) 61b := NewConstraint (GTE ,- 100 ,r .T (1 ),l .T (- 1 )) 62c := NewConstraint (GTE ,0 ,l .T (1 )) 63 64s := NewSolver () 65 66_ ,err := s .Add (1e9 ,a ) 67assertNoError (t ,err ) 68 69_ ,err = s .Add (1e9 ,b ) 70assertNoError (t ,err ) 71 72_ ,err = s .Add (1e9 ,c ) 73assertNoError (t ,err ) 74 75assertEqual (t ,0 ,s .Val (l )) 76assertEqual (t ,50 ,s .Val (m )) 77assertEqual (t ,100 ,s .Val (r )) 78} 79 80func TestConstraintRequiringArtificialVariable (t * testing.T ) { 81s := NewSolver () 82 83p1 := New () 84p2 := New () 85p3 := New () 86container := New () 87 88_ ,err := s .Add (1e9 ,NewConstraint (EQ ,- 100 ,container .T (1 ))) 89assertNoError (t ,err ) 90 91_ ,err = s .Add (1e6 ,NewConstraint (GTE ,- 30 ,p1 .T (1 ))) 92assertNoError (t ,err ) 93 94_ ,err = s .Add (1e3 ,NewConstraint (EQ ,0 ,p1 .T (1 ),p3 .T (- 1 ))) 95assertNoError (t ,err ) 96 97_ ,err = s .Add (1e9 ,NewConstraint (EQ ,0 ,p2 .T (1 ),p1 .T (- 2 ))) 98assertNoError (t ,err ) 99 100_ ,err = s .Add (1e9 ,NewConstraint (EQ ,0 ,container .T (1 ),p1 .T (- 1 ),p2 .T (- 1 ),p3 .T (- 1 ))) 101assertNoError (t ,err ) 102 103assertEqual (t ,30 ,s .Val (p1 )) 104assertEqual (t ,60 ,s .Val (p2 )) 105assertEqual (t ,10 ,s .Val (p3 )) 106assertEqual (t ,100 ,s .Val (container )) 107}