//  Copyright (c) 2016 Marty Schoch

//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the
//  License. You may obtain a copy of the License at
//    http://www.apache.org/licenses/LICENSE-2.0
//  Unless required by applicable law or agreed to in writing,
//  software distributed under the License is distributed on an "AS
//  IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
//  express or implied. See the License for the specific language
//  governing permissions and limitations under the License.

package smat

// ActionSeq represents a sequence of actions, used for populating a corpus
// of byte sequences for the corresponding fuzz tests
type ActionSeq []ActionID

// ByteEncoding runs the FSM to produce a byte sequence to trigger the
// desired action
func ( ActionSeq) ( Context, ,  ActionID,  ActionMap) ([]byte, error) {
	, ,  := .findSetupTeardown(, )
	if  != nil {
		return nil, 
	}
	,  := ()
	if  != nil {
		return nil, 
	}
	defer func() {
		_, _ = ()
	}()

	var  []byte
	for ,  := range  {
		,  := probeStateForAction(, )
		if  != nil {
			return nil, 
		}
		 = append(, )
		,  := []
		if ! {
			continue
		}
		,  = ()
		if  != nil {
			return nil, 
		}
	}
	return , nil
}

func probeStateForAction( State,  ActionID) (byte, error) {
	for  := 0;  < 256; ++ {
		 := (byte())
		if  ==  {
			return byte(), nil
		}
	}
	return 0, ErrActionNotPossible
}