An open API service indexing awesome lists of open source software.

https://github.com/chichunchen/ruby-enumerator


https://github.com/chichunchen/ruby-enumerator

iterator-library ruby

Last synced: 2 months ago
JSON representation

Awesome Lists containing this project

README

        

## yet-another-ruby-iterator
- Iteration stop when all the element in each has already yielded the block
- The `each` method in class `Triple` yield all of it's arguments, and then return itself before exit

### Installation
```
gem install bundler
bundle install
```

### Run
After the installation, just type ***rspec*** to run the spec

### File Structure
- All the implementations is in the lib `folder`, therefore, my implementation of the Enumerate module and the Triple class is in this folder.
- All the unit testing files are in the `spec` folder.
- The `spec_helper` in spec folder is for Rspec to manage the test.
- Tree Structure of the file structure:
```
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── lib
│   └── chichun_enum.rb
└── spec
├── chichun_enum_spec.rb
└── spec_helper.rb
```

### Notes
- RSpec is a tool for behavior driven test process, it allows developers to describe a sequences of actions,
and build our test case in whatever situation
- Simple case of writing tests using RSpec:
- Firstly, use the keyword `describe` to describe the method you'd like to test
- And then use keyword `context` to indicate the current situation, such as:
- Whether the method has argument
- Whether the method get block as argument
- Finally, write the unit tests in the `it` block
- The output hierarchy of `RSpec`
- If unit tests is written in a `context` block, then the output of tests indent
- Method `all?` and `any?` can both accept calling without block, therefore, I put the tests in the `context` block, and all of the unit tests inside the `context` block indent

```
#all?
return true if all three elements in t > 0
return false if one of the elements in t < 0
when block not given
return false if there are any elements that is nil
return false if there are any elements that is false
return true if there no elements that is false or nil

#any?
returns true if there is one element greater than 0
returns false since there is no elements in t greater than 0
when block not given
return true if there are any elements?
return false if no any elements?
```
- All of the method I wrote in `describe` added `#` as prefix, which means it's not an instance method, an instance method should be write as `.foo`

### Test of infinite loop
- From the ruby doc, if no argument is given or nil is given as an argument, then method `cycle` go into an infinite loop
- My way of testing infinite loop is to create a thread and then call `cycle()` or `cycle(nil)` inside that thread to make sure that the test is not blocked
- And then call sleep(x) in main thread to wait for the loop
- x is an arbitrary time which is not too short for setting the loop flag, and not too long to block our test suite
- The body of the loop set a flag to indicate that while calling `cycle`, the program really go into the loop, after a arbitrary time, main thread kill the created thread, and test the flag

### Implementation
- How to return `Enumerator` class if block not given
- `to_enum(:name_of_this_method, arg1, arg2, ..., argn) unless block_given?`
- What if the `Enumerator` that we want to return is not the one that we can get from :each
- Use `Enumerator.new` to create one
- in the block of the creation, we call ***yield*** just like we do in ***each***

### Reference
- http://rspec.info/
- http://www.betterspecs.org/