diff --git a/faker.go b/faker.go index dd5c76b..33f9a65 100644 --- a/faker.go +++ b/faker.go @@ -146,6 +146,10 @@ func (f Faker) Address() Address { return Address{&f} } +func (f Faker) Phone() Phone { + return Phone{&f} +} + func New() (f Faker) { seed := rand.NewSource(time.Now().Unix()) f = NewWithSeed(seed) diff --git a/phone.go b/phone.go new file mode 100644 index 0000000..0d6795b --- /dev/null +++ b/phone.go @@ -0,0 +1,109 @@ +package faker + +import ( + "fmt" + "strings" +) + +var ( + phoneFormats = []string{ + // International format + "+1-{{areaCode}}-{{exchangeCode}}-####", + "+1 ({{areaCode}}) {{exchangeCode}}-####", + "+1-{{areaCode}}-{{exchangeCode}}-####", + "+1.{{areaCode}}.{{exchangeCode}}.####", + "+1{{areaCode}}{{exchangeCode}}####", + // Standard formats + "{{areaCode}}-{{exchangeCode}}-####", + "({{areaCode}}) {{exchangeCode}}-####", + "1-{{areaCode}}-{{exchangeCode}}-####", + "{{areaCode}}.{{exchangeCode}}.####", + "{{areaCode}}-{{exchangeCode}}-####", + "({{areaCode}}) {{exchangeCode}}-####", + "1-{{areaCode}}-{{exchangeCode}}-####", + "{{areaCode}}.{{exchangeCode}}.####", + // Extensions + "{{areaCode}}-{{exchangeCode}}-#### x###", + "({{areaCode}}) {{exchangeCode}}-#### x###", + "1-{{areaCode}}-{{exchangeCode}}-#### x###", + "{{areaCode}}.{{exchangeCode}}.#### x###", + "{{areaCode}}-{{exchangeCode}}-#### x####", + "({{areaCode}}) {{exchangeCode}}-#### x####", + "1-{{areaCode}}-{{exchangeCode}}-#### x####", + "{{areaCode}}.{{exchangeCode}}.#### x####", + "{{areaCode}}-{{exchangeCode}}-#### x#####", + "({{areaCode}}) {{exchangeCode}}-#### x#####", + "1-{{areaCode}}-{{exchangeCode}}-#### x#####", + "{{areaCode}}.{{exchangeCode}}.#### x#####"} + + tollFreeAreaCodes = []string{"800", "844", "855", "866", "877", "888"} + + tollFreeFormats = []string{ // Standard formats + "{{tollFreeAreaCode}}-{{exchangeCode}}-####", + "({{tollFreeAreaCode}}) {{exchangeCode}}-####", + "1-{{tollFreeAreaCode}}-{{exchangeCode}}-####", + "{{tollFreeAreaCode}}.{{exchangeCode}}.####"} +) + +type Phone struct { + Faker *Faker +} + +func (p *Phone) AreaCode() (code string) { + number1 := p.Faker.NumberBetween(2, 9) + number2 := p.Faker.RandomDigit() + number3 := p.Faker.RandomDigitNot(number2) + return fmt.Sprintf("%d%d%d", number1, number2, number3) +} + +func (p *Phone) ExchangeCode() (code string) { + number1 := p.Faker.NumberBetween(2, 9) + number2 := p.Faker.RandomDigit() + number3 := p.Faker.RandomDigit() + + if number2 == 1 { + number3 = p.Faker.RandomDigitNot(1) + } + + return fmt.Sprintf("%d%d%d", number1, number2, number3) +} + +func (p *Phone) Number() string { + number := p.Faker.RandomStringElement(phoneFormats) + + // {{areaCode}} + if strings.Contains(number, "{{areaCode}}") { + number = strings.Replace(number, "{{areaCode}}", p.AreaCode(), 1) + } + + // {{exchangeCode}} + if strings.Contains(number, "{{exchangeCode}}") { + number = strings.Replace(number, "{{exchangeCode}}", p.ExchangeCode(), 1) + } + + return p.Faker.Numerify(number) +} + +func (p *Phone) TollFreeAreaCode() string { + return p.Faker.RandomStringElement(tollFreeAreaCodes) +} + +func (p *Phone) ToolFreeNumber() string { + number := p.Faker.RandomStringElement(tollFreeFormats) + + // {{tollFreeAreaCode}} + if strings.Contains(number, "{{tollFreeAreaCode}}") { + number = strings.Replace(number, "{{tollFreeAreaCode}}", p.TollFreeAreaCode(), 1) + } + + // {{exchangeCode}} + if strings.Contains(number, "{{exchangeCode}}") { + number = strings.Replace(number, "{{exchangeCode}}", p.ExchangeCode(), 1) + } + + return p.Faker.Numerify(number) +} + +func (p *Phone) E164Number() string { + return p.Faker.Numerify("+###########") +} diff --git a/phone_test.go b/phone_test.go new file mode 100644 index 0000000..ade087e --- /dev/null +++ b/phone_test.go @@ -0,0 +1,50 @@ +package faker + +import ( + "strings" + "testing" +) + +func TestAreaCode(t *testing.T) { + p := New().Phone() + Expect(t, true, len(p.AreaCode()) == 3) +} + +func TestExchangeCode(t *testing.T) { + p := New().Phone() + Expect(t, true, len(p.ExchangeCode()) == 3) +} + +func TestNumber(t *testing.T) { + a := New().Phone() + number := a.Number() + Expect(t, true, len(number) > 0) + Expect(t, false, strings.Contains(number, "{{areaCode}}")) + Expect(t, false, strings.Contains(number, "{{exchangeCode}}")) + Expect(t, false, strings.Contains(number, "#")) + Expect(t, false, strings.Contains(number, "{{")) + Expect(t, false, strings.Contains(number, "}}")) +} + +func TestTollFreeAreaCode(t *testing.T) { + a := New().Phone() + code := a.TollFreeAreaCode() + Expect(t, true, len(code) > 0) +} + +func TestTollFreeNumber(t *testing.T) { + a := New().Phone() + number := a.ToolFreeNumber() + Expect(t, true, len(number) > 0) + Expect(t, false, strings.Contains(number, "{{tollFreeAreaCode}}")) + Expect(t, false, strings.Contains(number, "{{exchangeCode}}")) + Expect(t, false, strings.Contains(number, "#")) + Expect(t, false, strings.Contains(number, "{{")) + Expect(t, false, strings.Contains(number, "}}")) +} + +func TestE164Number(t *testing.T) { + a := New().Phone() + number := a.E164Number() + Expect(t, true, len(number) > 0) +}