github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/internal/tables/map_test.go (about)

     1  package tables
     2  
     3  import (
     4  	"testing"
     5  	"testing/quick"
     6  
     7  	"github.com/hirochachacha/plua/object"
     8  )
     9  
    10  func TestMap(t *testing.T) {
    11  	f := func(mm map[object.Integer]object.Integer) bool {
    12  		m := newMap()
    13  
    14  		l := 0
    15  		if m.Len() != l {
    16  			return false
    17  		}
    18  
    19  		for k, v := range mm {
    20  			m.Set(k, v)
    21  
    22  			l++
    23  
    24  			if m.Len() != l {
    25  				return false
    26  			}
    27  		}
    28  
    29  		var pkey object.Value
    30  		var key object.Value
    31  		var val object.Value
    32  		for {
    33  			key, val, _ = m.Next(pkey)
    34  			if val == nil {
    35  				break
    36  			}
    37  
    38  			k1, v1, _ := m.Next(pkey)
    39  			if key != k1 || val != v1 {
    40  				return false
    41  			}
    42  
    43  			if m.Get(key) != val {
    44  				return false
    45  			}
    46  
    47  			ikey := key.(object.Integer)
    48  			ival := val.(object.Integer)
    49  
    50  			if mm[ikey] != ival {
    51  				return false
    52  			}
    53  
    54  			delete(mm, ikey)
    55  
    56  			if m.Len() != l {
    57  				return false
    58  			}
    59  
    60  			pkey = key
    61  		}
    62  
    63  		if len(mm) != 0 {
    64  			return false
    65  		}
    66  
    67  		return true
    68  	}
    69  
    70  	if err := quick.Check(f, nil); err != nil {
    71  		t.Error(err)
    72  	}
    73  }
    74  
    75  func TestConcurrentMap(t *testing.T) {
    76  	f := func(mm map[object.Integer]object.Integer) bool {
    77  		m := newConcurrentMap()
    78  
    79  		l := 0
    80  		if m.Len() != l {
    81  			return false
    82  		}
    83  
    84  		for k, v := range mm {
    85  			m.Set(k, v)
    86  
    87  			l++
    88  
    89  			if m.Len() != l {
    90  				return false
    91  			}
    92  		}
    93  
    94  		var pkey object.Value
    95  		var key object.Value
    96  		var val object.Value
    97  		for {
    98  			key, val, _ = m.Next(pkey)
    99  			if val == nil {
   100  				break
   101  			}
   102  
   103  			k1, v1, _ := m.Next(pkey)
   104  			if key != k1 || val != v1 {
   105  				return false
   106  			}
   107  
   108  			if m.Get(key) != val {
   109  				return false
   110  			}
   111  
   112  			ikey := key.(object.Integer)
   113  			ival := val.(object.Integer)
   114  
   115  			if mm[ikey] != ival {
   116  				return false
   117  			}
   118  
   119  			delete(mm, ikey)
   120  
   121  			if m.Len() != l {
   122  				return false
   123  			}
   124  
   125  			pkey = key
   126  		}
   127  
   128  		if len(mm) != 0 {
   129  			return false
   130  		}
   131  
   132  		return true
   133  	}
   134  
   135  	if err := quick.Check(f, nil); err != nil {
   136  		t.Error(err)
   137  	}
   138  }