Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ソースコードから読み解く - Quick はどのように実装されているのか?/quick-c...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yusuke Hosonuma
September 12, 2018
Programming
11k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ソースコードから読み解く - Quick はどのように実装されているのか?/quick-code-reading
俺コン 2018 Summer / Day. 1
https://orecon.connpass.com/event/94858/
Yusuke Hosonuma
September 12, 2018
More Decks by Yusuke Hosonuma
See All by Yusuke Hosonuma
KotlinTest で始める Property-based Testing/kotlintest-property-based-testing
yusukehosonuma
2
1.6k
Marzipan の正体は何だったのか そして SwiftUI の衝撃/wwdc19_marzipan_swiftui
yusukehosonuma
2
980
標準パッケージにおけるテストでの利用例から学ぶ testing / quick パッケージ/golang-testing-quick
yusukehosonuma
4
12k
Swift で ParameterizedTest をやってみた話/swift-parameterized-test
yusukehosonuma
4
2.3k
Property-based test beginning with SwiftCheck
yusukehosonuma
1
6.2k
XCTest(再)入門/reintroduction-to-xctest
yusukehosonuma
0
650
Swift 4.2 はどのような進化をしているのか/whats-new-swift42
yusukehosonuma
16
15k
HTTPモックライブラリ「Mockingjay」を使ってみた話/swift-mockingjay
yusukehosonuma
5
4.3k
SwiftにおけるMockライブラリの活用/swift-mock-library
yusukehosonuma
10
6.6k
Other Decks in Programming
See All in Programming
さぁV100、メモリをお食べ・・・
nilpe
0
150
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
320
Claspは野良GASの夢をみるか
takter00
0
210
Oxcを導入して開発体験が向上した話
yug1224
4
340
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
130
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
590
1B+ /day規模のログを管理する技術
broadleaf
0
110
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
800
Performance Engineering for Everyone
elenatanasoiu
0
210
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.5k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
190
Featured
See All Featured
How to make the Groovebox
asonas
2
2.2k
Believing is Seeing
oripsolob
1
150
New Earth Scene 8
popppiees
3
2.4k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
How to build a perfect <img>
jonoalderson
1
5.7k
The Invisible Side of Design
smashingmag
301
52k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
Between Models and Reality
mayunak
4
350
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Code Reviewing Like a Champion
maltzj
528
40k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Transcript
Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ιʔείʔυ͔ΒಡΈղ͘ 2VJDLͲͷΑ͏ʹ ࣮͞Ε͍ͯΔͷ͔ʁ
1 Զίϯ 2018 Summer / Day. 1 2018/09/12 (Wed) ࡉপ ༞հ@DeNA
"CPVU 2 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
:VTVLF)PTPOVNB • ॴଐ ⁃ %F/"ɹ48&5άϧʔϓɹςετج൫νʔϜ • 'BWPSJUF ⁃ •
ۙگ ⁃ J04%$Ͱൃද ⁃ ମ͍͍ͧʂ Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 3 @tobi462ʢτϏʣ Swift 4.2
:VTVLF)PTPOVNB • ॴଐ ⁃ %F/"ɹ48&5άϧʔϓɹςετج൫νʔϜ • 'BWPSJUF ⁃ •
ۙگ ⁃ J04%$Ͱൃද ⁃ ମ͍͍ͧʂ Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 4 @tobi462ʢτϏʣ Swift 4.2 ݄ࠒʹ։࠵ʁ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 5 $G1ݕࡧαʔϏε ϖϯΪϯଜ5FDIͰ࡞Γ·ͨ͠ʂ
ൃදεϥΠυͷϦϯΫ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 6 $G1ݕࡧαʔϏε ϖϯΪϯଜ5FDIͰ࡞Γ·ͨ͠ʂ
ൃදεϥΠυͷϦϯΫ iosdc-cfps.penginmura.tech
2VJDL 7 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
8 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. #%%ϑϨʔϜϫʔΫ 4XJGUൃදͷޙʹ044ެ։
9$5FTUͱ౷߹ • ςετφϏήʔλͰදࣔ • ΤϥʔϝοηʔδͪΌΜͱग़Δ Quick 34QFDΠϯεύΠΞ
/JNCMF 9 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Nimble 10 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ΞαʔγϣϯϥΠϒϥϦ
.BUIDFS"1* 2VJDL͔Βಠཱ Nimble
11 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. import XCTest
import Quick import Nimble class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } }
12 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. import XCTest
import Quick import Nimble class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ςετߏԽͱͯ͠ͷ2VJDL
13 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. import XCTest
import Quick import Nimble class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } Ξαʔγϣϯͱͯ͠ͷ/JNCMF
14 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Xcode
15 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. φϏήʔλʹදࣔ Xcode
16 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ςετͱͯ͠ೝࣝ Xcode
17 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Τϥʔ͕ΤσΟλʹදࣔ Xcode
Quick Α͘Ͱ͖ͯΔͳ͊ Swift ΫϩʔδϟʹΑΔ DSL ૉఢͩ
ͱ͜ΖͰ 18 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
19 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Α͘ߟ͑ͯΈΔͱ Ͳ͏࣮ͬͯݱ͞ΕͯΔΜͩΖ͏ʁ
͋ΒͨΊͯݟͯΈΔ
20 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
21 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͳͥφϏήʔλʹJUʹରԠ͢Δ໊લ͕ʁ
22 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. UFTU9YYͬͯϝιου໊͡Όͳ͍͚Ͳʁ
23 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ؔͳͷʹͲ͏ͬͯ%4-ߏΛอ࣋ʁ
24 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ΤϥʔͲ͏ͬͯग़ͯ͠ΔΜͩʁ
25 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ΤϥʔͲ͏ͬͯग़ͯ͠ΔΜͩʁ ͔Βͳ͍
ԶͨͪงғؾͰ Quick Λॻ͍͍ͯΔ
5PEBZ 26 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
͢͜ͱ 27 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 2VJDL͕Ͳ͏࣮ͬͯݱ͞ΕͯΔ͔ʁ
• 9$5FTUͱͷ౷߹ • %4- ͞ͳ͍͜ͱ 2VJDL/JNCMFͷ͍ํ /JNCMFͷΈ ϚϧνϓϥοτϑΥʔϜରԠͱ͔ Today ίʔυΛಡΈͭͭʂ ࡉ͔͍ͱ͜ΖׂѪ͍ͯ͘͠ʂ
28 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ίʔυϦʔσΟϯά͍ͯ͘͠ͱ͜Ζ
ΤϯτϦϙΠϯτ %4-͔ΒͷߏͷΈཱͯ 9$5FTU͔Βͷݺͼग़͠
29 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ίʔυϦʔσΟϯά͍ͯ͘͠ͱ͜Ζ
ΤϯτϦϙΠϯτ %4-͔ΒͷߏͷΈཱͯ 9$5FTU͔Βͷݺͼग़͠ Let’s Code Reading !
ϥΠϒϥϦͷؔ 30 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
31 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 2VJDL /JNCMF
9$5FTU 'PVOEBUJPO 0CKFDUJWF$3VOUJNFΛར༻ ར༻ҙ ϥΠϒϥϦͷؔ
32 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 2VJDL /JNCMF
9$5FTU 'PVOEBUJPO ࠓ͔Βݟ͍ͯ͘ ϥΠϒϥϦͷؔ
ΤϯτϦϙΠϯτ 33 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
34 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. import XCTest
import Quick import Nimble class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } }
35 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. import XCTest
import Quick import Nimble class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ࠓճͷαϯϓϧͷ4QFD
36 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. import XCTest
import Quick import Nimble class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } Ͳ͔͜ΒݺΕ͍ͯΔ͔ʁ
37 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. import XCTest
import Quick import Nimble class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ΫϥεΛݟͯΈΔ
38 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. #import <XCTest/XCTest.h>
@interface QuickSpec : XCTestCase - (void)spec; @property (class, nonatomic, readonly) QuickSpec *current; @end QuickSpec.h
39 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. #import <XCTest/XCTest.h>
@interface QuickSpec : XCTestCase - (void)spec; @property (class, nonatomic, readonly) QuickSpec *current; @end QuickSpec.h ͍͖ͳΓ Objective-C ʂ Ͱɺগͳ͍͏ͪͷ1ιʔε
40 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // QuickSpec.h
#import <XCTest/XCTest.h> @interface QuickSpec : XCTestCase - (void)spec; @property (class, nonatomic, readonly) QuickSpec *current; @end 9$5FTU$BTFΛܧঝ͍ͯ͠Δ QuickSpec.h
41 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // QuickSpec.m
@implementation QuickSpec + (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } QuickSpec.m
42 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // QuickSpec.m
@implementation QuickSpec + (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } 0CKFDUJWF$3VOUJNFʹΫϥε͕ ϩʔυ͞Εͨͱ͖ʹݺͼग़͞ΕΔ QuickSpec.m
43 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // QuickSpec.m
@implementation QuickSpec + (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } 8PSMEͷ4JOHMFUPOΛऔಘ͠ ΫϩʔδϟΛ࣮ߦ͠Α͏ͱ͍ͯ͠Δ QuickSpec.m
44 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // QuickSpec.m
@implementation QuickSpec + (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } ͜͜ͰࣗͷΠϯελϯεΛੜͯ͠ TQFDΛ࣮ߦ͍ͯ͠Δʂ QuickSpec.m
45 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // QuickSpec.m
@implementation QuickSpec + (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } ͜͜ͰࣗͷΠϯελϯεΛੜͯ͠ TQFDΛ࣮ߦ͍ͯ͠Δʂ QuickSpec.m spec ͕ݺΕΔΈ ͳΜͱͳ͘Θ͔ͬͨͧʂ
46 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͜͜·Ͱग़͖ͯͨιʔε CalcSpec.swift
QuickSpec.h / m
%4-ͷॲཧ 47 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
48 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift
49 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ߏతʹ͜͏ͳͬͯΔ CalcSpec.swift beforeEach describe context it describe
50 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ߏతʹ͜͏ͳͬͯΔ CalcSpec.swift beforeEach describe context it describe ॱ൪ʹݟ͍ͯ͘
51 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe
EFTDSJCF 52 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
53 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
describe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.describe(description, flags: flags, closure: closure) } public func context(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.context(description, flags: flags, closure: closure) } public func beforeEach(_ closure: @escaping BeforeExampleClosure) { World.sharedWorld.beforeEach(closure) } DSL.swift
54 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
describe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.describe(description, flags: flags, closure: closure) } public func context(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.context(description, flags: flags, closure: closure) } public func beforeEach(_ closure: @escaping BeforeExampleClosure) { World.sharedWorld.beforeEach(closure) } ... 8PSMEͷγϯάϧτϯʹରͯ͠ ҕৡ͍ͯ͠Δ͚ͩ DSL.swift
55 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } World+DSL.swift
56 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } 8PSMEͷFYUFOTJPO World+DSL.swift
57 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } &YBNQMF(SPVQΛੜͯ͠ World+DSL.swift
58 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } ݱࡏͷ&YBNQMF(SPVQʹՃ͠ World+DSL.swift
59 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } ΫϩʔδϟΛ࣮ͯ͠ߦ͍ͯ͠Δʂ World+DSL.swift
60 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } World.swift
61 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } ୀආͯ͠ݱࡏͷ&YBNQMF(SPVQΛஔ͖͑ World.swift
62 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } ΫϩʔδϟΛ࣮ߦ͠ World.swift
63 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } ୀආͯͨ͠&YBNQMF(SPVQΛݩʹ͍ͯ͠Δ World.swift
64 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } ୀආͯͨ͠&YBNQMF(SPVQΛݩʹ͍ͯ͠Δ World.swift closure ͬͯͳΜ͚ͩͬʁ ͦ͏͍͑
65 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // World.swift
final internal class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } }
66 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // World.swift
final internal class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } EFTDSJCFͷதͩʂ
67 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // World.swift
final internal class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } EFTDSJCFͷதͩʂ ͳΜͱͳ͘ݟ͖͑ͯͨͧʂ
68 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͜͜·Ͱग़͖ͯͨιʔε CalcSpec.swift
QuickSpec.h / m World+DSL.swift World.swift
CFGPSF&BDI 69 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
70 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe
71 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
describe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.describe(description, flags: flags, closure: closure) } public func context(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.context(description, flags: flags, closure: closure) } public func beforeEach(_ closure: @escaping BeforeExampleClosure) { World.sharedWorld.beforeEach(closure) } DSL.swift
72 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
describe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.describe(description, flags: flags, closure: closure) } public func context(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.context(description, flags: flags, closure: closure) } public func beforeEach(_ closure: @escaping BeforeExampleClosure) { World.sharedWorld.beforeEach(closure) } DSL.swift Γ8PSMEͷγϯάϧτϯʹରͯ͠ Ҡৡ͍ͯ͠Δ͚ͩ
73 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
describe(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.describe(description, flags: flags, closure: closure) } public func context(_ description: String, flags: FilterFlags = [:], closure: () -> Void) { World.sharedWorld.context(description, flags: flags, closure: closure) } public func beforeEach(_ closure: @escaping BeforeExampleClosure) { World.sharedWorld.beforeEach(closure) } DSL.swift Γ8PSMEͷγϯάϧτϯʹରͯ͠ Ҡৡ͍ͯ͠Δ͚ͩ DSL ෦ શ෦͜ͷͬΆ͍ͧʁ
74 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } World+DSL.swift
75 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } ݱࡏͷ&YBNQMF(SPVQͷ World+DSL.swift
76 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } IPPLTʹΫϩʔδϟΛՃͯ͠Δ World+DSL.swift
77 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // ExampleGroup.swift final public class ExampleGroup: NSObject { internal let hooks = ExampleHooks() } // ExampleHooks.swift final internal class ExampleHooks { internal var befores: [BeforeExampleWithMetadataClosure] = [] internal func appendBefore(_ closure: @escaping BeforeExampleClosure) { befores.append { (_: ExampleMetadata) in closure() } } } ExampleGroup.swift / ExampleHooks.swift
78 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // ExampleGroup.swift final public class ExampleGroup: NSObject { internal let hooks = ExampleHooks() } // ExampleHooks.swift final internal class ExampleHooks { internal var befores: [BeforeExampleWithMetadataClosure] = [] internal func appendBefore(_ closure: @escaping BeforeExampleClosure) { befores.append { (_: ExampleMetadata) in closure() } } } ExampleGroup.swift / ExampleHooks.swift
79 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // ExampleGroup.swift final public class ExampleGroup: NSObject { internal let hooks = ExampleHooks() } // ExampleHooks.swift final internal class ExampleHooks { internal var befores: [BeforeExampleWithMetadataClosure] = [] internal func appendBefore(_ closure: @escaping BeforeExampleClosure) { befores.append { (_: ExampleMetadata) in closure() } } } ྻʹΫϩʔδϟΛBQQFOEͯ͠Δ ExampleGroup.swift / ExampleHooks.swift
80 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // ExampleGroup.swift final public class ExampleGroup: NSObject { internal let hooks = ExampleHooks() } // ExampleHooks.swift final internal class ExampleHooks { internal var befores: [BeforeExampleWithMetadataClosure] = [] internal func appendBefore(_ closure: @escaping BeforeExampleClosure) { befores.append { (_: ExampleMetadata) in closure() } } } ྻʹΫϩʔδϟΛBQQFOEͯ͠Δ ExampleGroup.swift / ExampleHooks.swift currentExampleGropup ͕ ͳΜ͔ͩϙΠϯτΈ͍ͨͧʁ
81 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } World+DSL.swift
82 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // World.swift final internal class World: _WorldBase { internal var currentExampleGroup: ExampleGroup! internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } World+DSL.swift / World.swift
83 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // World.swift final internal class World: _WorldBase { internal var currentExampleGroup: ExampleGroup! internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } 8PSME͕͍࣋ͬͯͯ World+DSL.swift / World.swift
84 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // World.swift final internal class World: _WorldBase { internal var currentExampleGroup: ExampleGroup! internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } ͖ͬ͞Ұ࣌ୀආͯͨͭͩ͠ʂ World+DSL.swift / World.swift
85 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func beforeEach(_ closure: @escaping BeforeExampleClosure) { guard currentExampleMetadata == nil else { raiseError("...") } currentExampleGroup.hooks.appendBefore(closure) } } // World.swift final internal class World: _WorldBase { internal var currentExampleGroup: ExampleGroup! internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } ͖ͬ͞Ұ࣌ୀආͯͨͭͩ͠ʂ World+DSL.swift / World.swift ͳΜ͔ͩͭͳ͕͖ͬͯͨͧʁ
86 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͜͜·Ͱग़͖ͯͨιʔε CalcSpec.swift
QuickSpec.h / m World+DSL.swift World.swift ExampleGroup.swift ExampleHooks.swift
EFTDSJCF 87 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ࠶ͼ
88 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ͖ͬ͞ݟͨͭ
89 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } ࠶ܝ World+DSL.swift
90 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } ৽͍͠&YBNQMF(SPVQΛੜͯ͠ ݱࡏͷ&YBNQMF(SPVQʹՃ World+DSL.swift
91 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } ৽͍͠&YBNQMF(SPVQΛੜͯ͠ ݱࡏͷ&YBNQMF(SPVQʹՃ World+DSL.swift ExampleGroup ͬͯ describe ͷ͜ͱͰʁ
92 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } }
93 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } lBEEz ੜͯ͠ΔͷࠓճͷEFTDSJCFͰ
94 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } લճͷ͕DVSSFOU&YBNQMF(SPVQͰ
95 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ৽͍͠ͷΛՃͯ͠
96 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ΫϩʔδϟΛͯ͠ॲཧͯ͠Δʂ
97 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // World+DSL.swift
extension World { internal func describe(_ description: String, flags: FilterFlags, closure: () -> Void) { let group = ExampleGroup(description: description, flags: flags) currentExampleGroup.appendExampleGroup(group) performWithCurrentExampleGroup(group, closure: closure) } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ΫϩʔδϟΛͯ͠ॲཧͯ͠Δʂ DSL ߏ͕ΈཱͯΒΕΔ Έ͕ݟ͖͑ͯͨͧʂ
98 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } World.swift
99 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } ྫͷҰ࣌ୀආͯͨ͠ίʔυ World.swift
100 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } ͖ͬ͞࡞ͬͨ&YBNQMF(SPVQͱ தͷΫϩʔδϟ͕Ҿʹ World.swift
101 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } World currentExampleGroup ݱࡏͷ&YBNQMF(SPVQΛ World.swift
102 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } World currentExampleGroup ৽͍͠ͷʹΓସ͑ͯ World.swift
103 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } ΫϩʔδϟΛධՁ͠ World currentExampleGroup World.swift
104 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. final internal
class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } World currentExampleGroup ݩʹ͍ͯ͠Δʂ World.swift
105 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // World.swift
final internal class World: _WorldBase { internal func performWithCurrentExampleGroup(_ group: ExampleGroup, closure: () -> Void) { let previousExampleGroup = currentExampleGroup currentExampleGroup = group closure() currentExampleGroup = previousExampleGroup } } class CalcSpec: QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } World currentExampleGroup ݩʹ͍ͯ͠Δʂ World.swift ͜Ε͕୯ͳΔؔʴΫϩʔδϟͰ ঢ়ଶΛอ࣋ͭͭ͠ΈཱͯΔΈ 8PSME͕ίϯςΩετΛΓସ͍͑ͯ͘
106 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͜͜·Ͱग़͖ͯͨιʔε CalcSpec.swift
QuickSpec.h / m World+DSL.swift World.swift ExampleGroup.swift ExampleHooks.swift
DPOUFYU 107 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
108 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe
109 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func context(_ description: String, flags: FilterFlags, closure: () -> Void) { guard currentExampleMetadata == nil else { raiseError("...") } self.describe(description, flags: flags, closure: closure) } } World+DSL.swift
110 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func context(_ description: String, flags: FilterFlags, closure: () -> Void) { guard currentExampleMetadata == nil else { raiseError("...") } self.describe(description, flags: flags, closure: closure) } } EFTDSJCFΛݺΜͰΔ͚ͩ World+DSL.swift
111 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ internal func context(_ description: String, flags: FilterFlags, closure: () -> Void) { guard currentExampleMetadata == nil else { raiseError("...") } self.describe(description, flags: flags, closure: closure) } } EFTDSJCFΛݺΜͰΔ͚ͩ World+DSL.swift describe = context = ExampleGroup %4-ͱ໊ͯ͠લ͕ఏڙ͞Ε͍ͯΔ͚ͩ ࣮ଶ
JU 112 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. lͦΕz͕ݟ͑ͨΒɺऴΘΓɻ
113 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } ࠷ޙʂ CalcSpec.swift beforeEach describe context it describe
114 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
it(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) } DSL.swift
115 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
it(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) } ϚΫϩͰʮϑΝΠϧʯͱʮߦʯΛड͚औΓ DSL.swift
116 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. public func
it(_ description: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, closure: @escaping () -> Void) { World.sharedWorld.it(description, flags: flags, file: file, line: line, closure: closure) } ͍ͭͷΑ͏ʹ8PSMEʹҕৡ DSL.swift
117 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { let callsite = Callsite(file: file, line: line) let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) currentExampleGroup.appendExample(example) } } World+DSL.swift
118 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { let callsite = Callsite(file: file, line: line) let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) currentExampleGroup.appendExample(example) } } ϑΝΠϧͱߦΛߏମʹϥοϓ͠ World+DSL.swift
119 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { let callsite = Callsite(file: file, line: line) let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) currentExampleGroup.appendExample(example) } } &YBNQMFΛੜ͠ World+DSL.swift
120 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. extension World
{ @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { let callsite = Callsite(file: file, line: line) let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) currentExampleGroup.appendExample(example) } } DVSSFOU&YBNQMF(SPVQʹՃ World+DSL.swift
121 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // World+DSL.swift
extension World { @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { let callsite = Callsite(file: file, line: line) let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) currentExampleGroup.appendExample(example) } } DVSSFOU&YBNQMF(SPVQʹՃ Έͳ·Ͱݴ͏ͳ ͏͔͍ͬͯΔ
122 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. // World+DSL.swift
extension World { @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { let callsite = Callsite(file: file, line: line) let example = Example(description: description, callsite: callsite, flags: flags, closure: closure) currentExampleGroup.appendExample(example) } } DVSSFOU&YBNQMF(SPVQʹՃ it = Example ͩʂ ಡΊΔɺಡΊΔͧʂ
%4-શମΛݟ͢ 123 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
124 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe
125 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ΦϒδΣΫτͷߏ͕ ݟ͖͑ͯͨͧ
126 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ExampleGroup: calc EFTDSJCF&YBNQMF(SPVQ
127 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ExampleGroup: calc hooks.befores
128 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ExampleGroup: calc hooks.befores ExampleGroup: add
129 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ExampleGroup: calc hooks.befores ExampleGroup: add ExampleGroup: 1 + 1 DPOUFYU&YBNQMF(SPVQ
130 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ExampleGroup: calc hooks.befores ExampleGroup: add ExampleGroup: 1 + 1 Example: works JU&YBNQMF
131 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ExampleGroup: calc hooks.befores ExampleGroup: add ExampleGroup: 1 + 1 Example: works CallSite (file, line) expect(calc.add(1, 1)).to(equal(2)) ϑΝΠϧɾߦɺΞαʔγϣϯίʔυΛ࣋ͭ
132 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift beforeEach describe context it describe ExampleGroup: calc hooks.befores ExampleGroup: add ExampleGroup: 1 + 1 Example: works CallSite (file, line) expect(calc.add(1, 1)).to(equal(2)) ϑΝΠϧɾߦɺΞαʔγϣϯίʔυΛ࣋ͭ Quick ͷ DSL શʹཧղͨ͠
9$5FTU͔Βͷݺͼग़͠ 133 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
134 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift
135 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift %4-ͷΤϯτϦϙΠϯτҎ֎ఆ͍ٛͯ͠ͳ͍
136 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. class CalcSpec:
QuickSpec { override func spec() { describe("calc") { var calc: Calc! beforeEach { calc = Calc() } describe("add") { context("1 + 1") { it("works") { expect(calc.add(1, 1)).to(equal(2)) } } } } } } CalcSpec.swift %4-ͷΤϯτϦϙΠϯτҎ֎ఆ͍ٛͯ͠ͳ͍ ΤϯτϦϙΠϯτʹ ൿີ͕͋Δʹҧ͍ͳ͍ ͏ҰݟͯΈΔ
137 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } QuickSpec.m
138 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } TQFD͕ݺΕͨޙͰ QuickSpec.m
139 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (void)initialize { [QuickConfiguration initialize]; World *world = [World sharedWorld]; [world performWithCurrentExampleGroup:[world rootExampleGroupForSpecClass:self] closure:^{ QuickSpec *spec = [self new]; @try { [spec spec]; } @catch (NSException *exception) { ... } [self testInvocations]; }]; } Կ͔ݺΜͰΔʂ QuickSpec.m
140 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } QuickSpec.m
141 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } JUʹରԠ͢Δ&YBNQMFΛநग़ͯ͠ QuickSpec.m
142 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } &YBNQMFΛΠϯελϯεϝιουʹՃͯ͠ QuickSpec.m
143 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } 4FMFDUPS͔Β/4*OWPDBUJPOΛੜͯ͠ QuickSpec.m
144 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } ͦͷҰཡΛฦͯ͠Δʂ QuickSpec.m
145 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } ͦͷҰཡΛฦͯ͠Δʂ QuickSpec.m Selector ͔Δ͚Ͳ NSInvocation ͬͯԿͩʁ TFMFDUPSͱ͔Ͱ
146 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. NSInvocation ϝοηʔδϯάΛදݱͨ͠ΦϒδΣΫτ
0CKFDUJWF$3VOUJNFݶఆͷػೳ ଞݴޠͰݴ͑ʮϦϑϨΫγϣϯʯʹ͍ۙ 0CKFDUJWF$ʹ͓͚Δϝιουݺͼग़͠
147 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. NSInvocation ϝοηʔδϯάΛදݱͨ͠ΦϒδΣΫτ
0CKFDUJWF$3VOUJNFݶఆͷػೳ ଞݴޠͰݴ͑ʮϦϑϨΫγϣϯʯʹ͍ۙ 0CKFDUJWF$ʹ͓͚Δϝιουݺͼग़͠ Dog walk(time: Time) NSInvocation XBML
148 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. NSInvocation ϝοηʔδϯάΛදݱͨ͠ΦϒδΣΫτ
0CKFDUJWF$3VOUJNFݶఆͷػೳ ଞݴޠͰݴ͑ʮϦϑϨΫγϣϯʯʹ͍ۙ 0CKFDUJWF$ʹ͓͚Δϝιουݺͼग़͠ Dog walk(time: Time) NSInvocation XBML ίϯύΠϧ࣌ʹ֬ఆͯ͠ͳ͍ ϝιουಈతʹݺͼग़ͤΔʂ 0CKFDUJWF$Ͱ
149 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } QuickSpec.m
150 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } it("works") { expect(calc.add(1, 1)).to(equal(2)) } Example: works NSInvocation JUʹର͢Δݺͼग़͠Λੜͯ͠ฦͯ͠Δʂ QuickSpec.m
151 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. @implementation QuickSpec
+ (NSArray *)testInvocations { NSArray *examples = [[World sharedWorld] examplesForSpecClass:[self class]]; NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[examples count]]; NSMutableSet<NSString*> *selectorNames = [NSMutableSet set]; for (Example *example in examples) { SEL selector = [self addInstanceMethodForExample:example classSelectorNames:selectorNames]; NSMethodSignature *signature = [self instanceMethodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.selector = selector; [invocations addObject:invocation]; } return invocations; } it("works") { expect(calc.add(1, 1)).to(equal(2)) } Example: works NSInvocation JUʹର͢Δݺͼग़͠Λੜͯ͠ฦͯ͠Δʂ QuickSpec.m ͜Ε͔ͬͯͯ͠͠ ͋ͷҰཡʹରԠͯ͠Δʁ ͋Εʁ
152 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
153 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͋ͷҰཡ
154 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͋ͷҰཡ ࢼ͠ʹσόοάͯ͠
Selector ͷதΛ͍ͯΈΔ
155 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
156 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
157 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. શʹҰக
158 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. + (NSArray
*)testInvocations Ͱ ςετରͷҰཡΛฦͤΔΈ 9$5FTU
͜͜·ͰͷྲྀΕΛৼΓฦΔ 159 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
160 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
161 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ΫϥεϩʔυʹΑΓ͕ࣗੜ͞Εͯ
162 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. TQFD ͕ݺͼग़͞ΕΔ
163 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 8PSMEͰίϯςΩετΛҡ࣋ͭͭ͠ %4-ΛΦϒδΣΫτߏʹΈཱͯ
164 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. &YBNQMFSVOͷ/4*OWPDBUJPOΛ 9$5FTU͔ΒͷίʔϧόοΫͰฦ͢
165 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͦͷҰཡ͕9$5FTUʹΑΓ࣮ߦ͞Ε ςετ݁Ռ͕φϏήʔλʹදࣔ͞ΕΔ
166 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ͦͷҰཡ͕9$5FTUʹΑΓ࣮ߦ͞Ε ςετ݁Ռ͕φϏήʔλʹදࣔ͞ΕΔ
Quick શʹཧղͨ͠
·ͱΊ 167 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
168 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ·ͱΊ 2VJDL͕Ͳ͏ಈ͔͘ݟ͖ͯͨ
• ΤϯτϦϙΠϯτ • %4-͔ΒΦϒδΣΫτߏͷੜ • 9$5FTUʹςετରҰཡΛ͢ 0CKFDUJWF$ϥϯλΠϜͷ׆༻ • Ϋϥεϩʔυ࣌ͷJOJUJBMJ[F • /4*OWPDBUJPOʹΑΔಈతϝοηʔδϯά 8PSME͕ίϯςΩετΛҡ࣋
169 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ·ͱΊ 2VJDL͕Ͳ͏ಈ͔͘ݟ͖ͯͨ
• ΤϯτϦϙΠϯτɿTQFD • %4-͔ΒΦϒδΣΫτߏͷੜ • 8PSMEΛͬͨίϯςΩετҡ࣋ • 9$5FTUʹςετରҰཡΛฦ͢ 0CKFDUJWF$ϥϯλΠϜͷ׆༻ • Ϋϥεϩʔυ࣌ͷJOJUJBMJ[F • /4*OWPDBUJPOʹΑΔಈతϝοηʔδϯά ͋ͳͨࠓ͔Β Quick ίϯτϦϏϡʔλ ࢲ
॓ 170 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ࢲͪΌΜͱΓ·͢
171 Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ॓ &YBNQMF࣮ߦ࣌ʹCFGPSF&BDI͕ॲཧ͞ΕΔΈ
• BGUFS&BDIʁ • CFGPSF4VJUFʁ ςετ໊Ͳ͜Ͱઃఆ͞Ε͍ͯΔʁ /JNCMFͷΤϥʔ͕ਖ਼͍͠Ґஔʹදࣔ͞ΕΔΈ
%JEZPVFOKPZ $PEFSFBEJOH 172 Copyright (C) DeNA Co.,Ltd. All Rights Reserved.