@@ -21,29 +21,155 @@ import chaiAsPromised from 'chai-as-promised';
21
21
import { ChromeAdapter } from './chrome-adapter' ;
22
22
import { Availability , LanguageModel } from '../types/language-model' ;
23
23
import { stub } from 'sinon' ;
24
+ import * as util from '@firebase/util' ;
24
25
25
26
use ( sinonChai ) ;
26
27
use ( chaiAsPromised ) ;
27
28
28
29
describe ( 'ChromeAdapter' , ( ) => {
29
- describe ( 'isOnDeviceRequest' , ( ) => {
30
- it ( 'returns true for simple text part' , async ( ) => {
30
+ describe ( 'isAvailable' , ( ) => {
31
+ it ( 'returns false if mode is only cloud' , async ( ) => {
32
+ const adapter = new ChromeAdapter ( undefined , 'only_in_cloud' ) ;
31
33
expect (
32
- ChromeAdapter . _isOnDeviceRequest ( {
33
- contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
34
+ await adapter . isAvailable ( {
35
+ contents : [ ]
34
36
} )
35
- ) . to . be . true ;
37
+ ) . to . be . false ;
36
38
} ) ;
37
- it ( 'returns false if contents empty' , async ( ) => {
39
+ it ( 'returns false if browser is not Chrome' , async ( ) => {
40
+ const chromeStub = stub ( util , 'isChrome' ) . returns ( false ) ;
41
+ const adapter = new ChromeAdapter ( undefined , 'prefer_on_device' ) ;
38
42
expect (
39
- ChromeAdapter . _isOnDeviceRequest ( {
43
+ await adapter . isAvailable ( {
40
44
contents : [ ]
41
45
} )
42
46
) . to . be . false ;
47
+ chromeStub . restore ( ) ;
43
48
} ) ;
44
- } ) ;
45
- describe ( 'isAvailable' , ( ) => {
46
- it ( 'returns true if a model is available' , async ( ) => {
49
+ it ( 'returns false if AI API is undefined' , async ( ) => {
50
+ const adapter = new ChromeAdapter ( undefined , 'prefer_on_device' ) ;
51
+ expect (
52
+ await adapter . isAvailable ( {
53
+ contents : [ ]
54
+ } )
55
+ ) . to . be . false ;
56
+ } ) ;
57
+ it ( 'returns false if LanguageModel API is undefined' , async ( ) => {
58
+ const adapter = new ChromeAdapter (
59
+ { } as LanguageModel ,
60
+ 'prefer_on_device'
61
+ ) ;
62
+ expect (
63
+ await adapter . isAvailable ( {
64
+ contents : [ ]
65
+ } )
66
+ ) . to . be . false ;
67
+ } ) ;
68
+ it ( 'returns false if request contents empty' , async ( ) => {
69
+ const adapter = new ChromeAdapter (
70
+ { } as LanguageModel ,
71
+ 'prefer_on_device'
72
+ ) ;
73
+ expect (
74
+ await adapter . isAvailable ( {
75
+ contents : [ ]
76
+ } )
77
+ ) . to . be . false ;
78
+ } ) ;
79
+ it ( 'returns false if request content has function role' , async ( ) => {
80
+ const adapter = new ChromeAdapter (
81
+ { } as LanguageModel ,
82
+ 'prefer_on_device'
83
+ ) ;
84
+ expect (
85
+ await adapter . isAvailable ( {
86
+ contents : [
87
+ {
88
+ role : 'function' ,
89
+ parts : [ ]
90
+ }
91
+ ]
92
+ } )
93
+ ) . to . be . false ;
94
+ } ) ;
95
+ it ( 'returns false if request content has multiple parts' , async ( ) => {
96
+ const adapter = new ChromeAdapter (
97
+ { } as LanguageModel ,
98
+ 'prefer_on_device'
99
+ ) ;
100
+ expect (
101
+ await adapter . isAvailable ( {
102
+ contents : [
103
+ {
104
+ role : 'user' ,
105
+ parts : [ { text : 'a' } , { text : 'b' } ]
106
+ }
107
+ ]
108
+ } )
109
+ ) . to . be . false ;
110
+ } ) ;
111
+ it ( 'returns false if request content has non-text part' , async ( ) => {
112
+ const adapter = new ChromeAdapter (
113
+ { } as LanguageModel ,
114
+ 'prefer_on_device'
115
+ ) ;
116
+ expect (
117
+ await adapter . isAvailable ( {
118
+ contents : [
119
+ {
120
+ role : 'user' ,
121
+ parts : [ { inlineData : { mimeType : 'a' , data : 'b' } } ]
122
+ }
123
+ ]
124
+ } )
125
+ ) . to . be . false ;
126
+ } ) ;
127
+ it ( 'returns false if request system instruction has function role' , async ( ) => {
128
+ const adapter = new ChromeAdapter (
129
+ { } as LanguageModel ,
130
+ 'prefer_on_device'
131
+ ) ;
132
+ expect (
133
+ await adapter . isAvailable ( {
134
+ contents : [ ] ,
135
+ systemInstruction : {
136
+ role : 'function' ,
137
+ parts : [ ]
138
+ }
139
+ } )
140
+ ) . to . be . false ;
141
+ } ) ;
142
+ it ( 'returns false if request system instruction has multiple parts' , async ( ) => {
143
+ const adapter = new ChromeAdapter (
144
+ { } as LanguageModel ,
145
+ 'prefer_on_device'
146
+ ) ;
147
+ expect (
148
+ await adapter . isAvailable ( {
149
+ contents : [ ] ,
150
+ systemInstruction : {
151
+ role : 'function' ,
152
+ parts : [ { text : 'a' } , { text : 'b' } ]
153
+ }
154
+ } )
155
+ ) . to . be . false ;
156
+ } ) ;
157
+ it ( 'returns false if request system instruction has non-text part' , async ( ) => {
158
+ const adapter = new ChromeAdapter (
159
+ { } as LanguageModel ,
160
+ 'prefer_on_device'
161
+ ) ;
162
+ expect (
163
+ await adapter . isAvailable ( {
164
+ contents : [ ] ,
165
+ systemInstruction : {
166
+ role : 'function' ,
167
+ parts : [ { inlineData : { mimeType : 'a' , data : 'b' } } ]
168
+ }
169
+ } )
170
+ ) . to . be . false ;
171
+ } ) ;
172
+ it ( 'returns true if model is readily available' , async ( ) => {
47
173
const languageModelProvider = {
48
174
availability : ( ) => Promise . resolve ( Availability . available )
49
175
} as LanguageModel ;
0 commit comments