license import * as tf from '@tensorflow/tfjs-core' ; import { localStorageIO } from '../utils/local_storage' ; describe ( 'localStorageIO' , ( ) => { const modelTopology1 = { 'class_name' : 'Sequential' , 'keras_version' : '2.1.4' , 'config' : [ { 'class_name' : 'Dense' , 'config' : { 'kernel_initializer' : { 'class_name' : 'VarianceScaling' , 'config' : { 'distribution' : 'uniform' , 'scale' : 1.0 , 'seed' : null , 'mode' : 'fan_avg' } } , 'name' : 'dense' , 'kernel_constraint' : null , 'bias_regularizer' : null , 'bias_constraint' : null , 'dtype' : 'float32' , 'activation' : 'linear' , 'trainable' : true , 'kernel_regularizer' : null , 'bias_initializer' : { 'class_name' : 'Zeros' , 'config' : { } } , 'units' : 1 , 'batch_input_shape' : [ null , 3 ] , 'use_bias' : true , 'activity_regularizer' : null } } ] , 'backend' : 'tensorflow' } ; const weightSpecs1 = [ { name : 'dense/kernel' , shape : [ 3 , 1 ] , dtype : 'float32' , } , { name : 'dense/bias' , shape : [ 1 ] , dtype : 'float32' , } ] ; const weightData1 = new ArrayBuffer ( 16 ) ; const artifacts1 = { modelTopology : modelTopology1 , weightSpecs : weightSpecs1 , weightData : weightData1 , format : 'layers-model' , generatedBy : 'TensorFlow.js v0.0.0' , convertedBy : null } ; const artifactsV0 = { modelTopology : modelTopology1 , weightSpecs : weightSpecs1 , weightData : weightData1 } ; let storage ; beforeEach ( ( ) => { storage = { } ; spyOn ( wx , 'getStorage' ) . and . callFake ( ( { key , success , fail } ) => { success ( { data : storage [ key ] } ) ; } ) ; spyOn ( wx , 'setStorageSync' ) . and . callFake ( ( key , value ) => { storage [ key ] = value ; } ) ; spyOn ( wx , 'removeStorageSync' ) . and . callFake ( ( key ) => { delete storage [ key ] ; } ) ; } ) ; it ( 'constructs an IOHandler' , async ( ) => { const handler = localStorageIO ( 'foo' ) ; expect ( typeof handler . load ) . toBe ( 'function' ) ; expect ( typeof handler . save ) . toBe ( 'function' ) ; } ) ; it ( 'save returns a SaveResult' , async ( ) => { const handler = localStorageIO ( 'FooModel' ) ; const result = await handler . save ( artifacts1 ) ; expect ( result . modelArtifactsInfo ) . toBeDefined ( ) ; expect ( result . modelArtifactsInfo ) . not . toBeNull ( ) ; expect ( result . modelArtifactsInfo . modelTopologyType ) . toBe ( 'JSON' ) ; expect ( result . modelArtifactsInfo . weightDataBytes ) . toBe ( 16 ) ; } ) ; it ( 'Save-load round trip succeeds' , async ( ) => { const handler = localStorageIO ( 'FooModel' ) ; await handler . save ( artifacts1 ) ; const handler2 = localStorageIO ( 'FooModel' ) ; const loaded = await handler2 . load ( ) ; expect ( loaded . modelTopology ) . toEqual ( modelTopology1 ) ; expect ( loaded . weightSpecs ) . toEqual ( weightSpecs1 ) ; expect ( loaded . weightData ) . toEqual ( weightData1 ) ; expect ( loaded . format ) . toEqual ( 'layers-model' ) ; expect ( loaded . generatedBy ) . toEqual ( 'TensorFlow.js v0.0.0' ) ; expect ( loaded . convertedBy ) . toEqual ( null ) ; } ) ; it ( 'Save-load round trip succeeds: v0 format' , async ( ) => { const handler1 = localStorageIO ( 'FooModel' ) ; await handler1 . save ( artifactsV0 ) ; const handler2 = localStorageIO ( 'FooModel' ) ; const loaded = await handler2 . load ( ) ; expect ( loaded . modelTopology ) . toEqual ( modelTopology1 ) ; expect ( loaded . weightSpecs ) . toEqual ( weightSpecs1 ) ; expect ( loaded . weightData ) . toEqual ( weightData1 ) ; expect ( loaded . format ) . toEqual ( undefined ) ; expect ( loaded . generatedBy ) . toEqual ( undefined ) ; expect ( loaded . convertedBy ) . toEqual ( undefined ) ; } ) ; } ) ;